0
我想分析MyComponent
類中聲明的字段變量,我想獲取GenericDeclartion的字段類的類型,而不是它在MyComponent
中聲明的類型。演示如下。如何使用Java反射從ParameterizedType獲取GenericDeclaration的類型?
public class SomeConfig<OP extends Operation> {
private OP operation;
public SomeConfig(OP op) {
this.operation = op;
}
}
public class MyComponent {
private SomeConfig<?> config;
public MyComponent(SomeConfig<?> config) {
this.config = config;
}
}
public class MyAnalysis {
public static void main(String[] args) {
Class clazz = MyComponent.class;
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
Type type = f.getGenericType();
if(type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType)type;
System.out.println(pType.getActualTypeArguments()[0]); // which prints "?" for sure
}
}
}
}
的問題:打印結果是 「?」當然。但我只想要打印Operation
的類型而不是「?」。它可以實現嗎?
還有['TypeToken'](http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/reflect/TypeToken.html),特別是[此構造函數] (http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/reflect/TypeToken.html#TypeToken-java.lang.Class-),但是「TypeToken」不是魔術,並且可能會或可能不會爲OP所做的工作。 'TypeToken'需要1.一個具體的*非泛型*類型參數(否則'tt.getType()'不會返回一個'Class'),2.一個子類,顯式或隱式,以及3.提供的類型參數if到超類的'extends'子句。 – Radiodef
我不太熟悉番石榴。我更詳細地看'TypeToken'。 'TypeToken(類> declaringClass)'似乎做同樣的事情:將類實例存儲在'TypeToken'中(正如你所說的那樣沒有魔力)。如果我理解的很好,它可以做同樣的事情,但不需要向構造函數中添加類參數,因爲TypeToken在聲明類中實例化時將完成類型捕獲:'new TypeToken(getClass())'... –
davidxxx
....它似乎真的是一個很好的解決方案,因爲它不會改變泛型類的構造函數簽名。但是,添加一個特定的庫(目前無法使用)並提供一個空的匿名類來捕獲類型(當您閱讀代碼時可能看起來令人驚訝),但這是一個需要考慮的因素。無論如何謝謝你的這些信息。真的很有用。 – davidxxx