[英]Instantiating Generic Parameterized Type from class file
因此,客戶端將以以下方式創建類:
public class Tester implements Test<Type1, Type2, Type3> {
@override
public method1(...)
...
}
然后,客戶端會將.class文件(IE Tester.class)傳遞給我們。
然后,我們想實例化客戶端的類,並根據泛型使用的類型運行其method1。 到目前為止,我有以下代碼,但我認為我沒有走正確的道路:
//tempClass = <ClassName>.class
Type[] genericTypes;
Type[] genericInterfaces = tempClass.getGenericInterfaces();
if(genericInterfaces[0] instanceof ParameterizedType){
genericTypes = ((ParameterizedType)genericInterfaces[0])
.getActualTypeArguments();
}
Class<Tester<genericTypes[0], genericTypes[1], genericTypes[2]>> classTest
= ( Class<Tester<genericTypes[0], genericTypes[1], genericTypes[2]>>) tempClass
Constuctor<...> = ... //get the constructor
//Create the new instance by calling .newInstance()
但是eclipse在Class>行中給了我很多錯誤,所以我認為這不是正確的方法。 我究竟做錯了什么?
Tere這里有幾個問題...
首先,這兩個Classname.class
本質上都是靜態構造-甚至都稱為類文字 。 因此,無法在運行時提供類型名稱,這就是Eclipse抱怨您嘗試這樣做的原因。 要獲得以類名作為字符串的Class
對象,可以使用Class.forName :
Class<?> tempClass = Class.forName("Tester");
(全限定名,沒有.class
后綴)。
其次, Tester<Type1, Type2, Type3>
。 在編譯時必須知道類型實參。 現在,我不確定為什么在這個地方需要這個演員表,但是我看到了兩個可能的原因:
為了確保由tempClass
表示的類確實實現了適當的接口,那么即使它在語法上是合法的,也沒有用。 強制轉換無法動態檢查泛型類型參數,因為它們也完全是編譯時構造的-由於類型擦除 ,它們在運行時不可用。 要檢查給定的Class
對象A是否是Class
對象B表示的類型的子類/實現,我們可以使用Class.isAssignableFrom
:
if (B.isAssignableFrom(A)) { // ... }
為了避免警告-對不起,這種類型轉換真的是不加以控制,因為沒有辦法,以確保它的正確性在運行時-再次,由於輸入erasuer。 在您知道@SuppressWarnings
有效且Java類型系統太笨而無法驗證您的聲明的地方使用@SuppressWarnings
。
無論如何,不要上課。 相反, newInstance
調用的結果。 現在,關於運行正確的方法...現在,您將獲得所需的所有信息,分為兩部分:調用方法的對象和已實現接口的參數類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.