実行時に宣言されたフィールドの汎用タイプにアクセスしようとしています。以前は、Java型消去のためにこれが不可能であるという印象を受けていました。ただし、よく知られているフレームワークの中には、実行時にリフレクションを介してジェネリック型を利用するものがあるため、これが当てはまらない場合があります。
例として、Guiceは指定したジェネリック型に基づいてプロバイダーを実装します。
public class Injectable{
@Inject
private Provider<SomeType> someTypeProvider;
}
リフレクションAPIを介して、フィールドの「SomeType」ジェネリック属性またはそのようなタイプ/メソッドなどにどのようにアクセスしますか?
さらに、Java 6 AnnotationProcessorAPIを介してこれらのジェネリック型属性にアクセスする方法も知っておくと役に立ちます。
ありがとう。
編集:
素晴らしいポインタをありがとうございました。ヘイレムのリンク、特にPrenkovの記事Java Reflection:Genericsへのリンクを使用してこれを行う方法を見つけました。
これが私が探していた答えです:
/**
* @author John Ericksen
*/
public class TypeReflectionExample {
public class SomeType{}
public class Injectable{
@Inject private Provider<SomeType> someTypeProvider;
}
public static void main(String[] args){
try {
Field providerField = Injectable.class.getDeclaredField("someTypeProvider");
Type genericFieldType = providerField.getGenericType();
if(genericFieldType instanceof ParameterizedType){
ParameterizedType aType = (ParameterizedType) genericFieldType;
Type[] fieldArgTypes = aType.getActualTypeArguments();
for(Type fieldArgType : fieldArgTypes){
Class fieldArgClass = (Class) fieldArgType;
System.out.println("fieldArgClass = " + fieldArgClass);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
結果:
fieldArgClass=クラスtest.TypeReflectionExample$SomeType
メソッド、コンストラクター、スーパークラスの拡張機能/実装などについても同じことができます。
彼の投稿が私の質問に直接答えなかったとしても、私をこの解決策に導いたので、私はヘイレムを授与しています。