2017-06-18 107 views
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的類型而不是「?」。它可以實現嗎?

回答

3

但我要的是得到

泛型編譯後刪除,因此,你不能在運行時訪問他們以這種方式操作

的類型。

爲了實現你的需要,你可以爲了通過參數化類型的類實例改變SomeConfig構造:

public class SomeConfig<OP extends Operation> { 
    private OP operation; 
    private Class<OP> clazz; 

    public SomeConfig(OP op, Class<OP> clazz) { 
     this.operation = op; 
     this.clazz = clazz; 
    } 
} 

現在clazz場可以用來知道類的類型。

+0

還有['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

+0

我不太熟悉番石榴。我更詳細地看'TypeToken'。 'TypeToken(類 declaringClass)'似乎做同樣的事情:將類實例存儲在'TypeToken'中(正如你所說的那樣沒有魔力)。如果我理解的很好,它可以做同樣的事情,但不需要向構造函數中添加類參數,因爲TypeToken在聲明類中實例化時將完成類型捕獲:'new TypeToken (getClass())'... – davidxxx

+0

....它似乎真的是一個很好的解決方案,因爲它不會改變泛型類的構造函數簽名。但是,添加一個特定的庫(目前無法使用)並提供一個空的匿名類來捕獲類型(當您閱讀代碼時可能看起來令人驚訝),但這是一個需要考慮的因素。無論如何謝謝你的這些信息。真的很有用。 – davidxxx

相關問題