2016-07-20 2 views
2

のJava 8は次のようなものを可能にする:実行時に型パラメータのアノテーションにアクセスできますか?

public List<@NonNull String> names; 

しかし、実行時にこの注釈にアクセスする方法はありますかそれはプラグインをコンパイラしか入手できますか? ...

は、戻り値の型の注釈へのアクセスを提供する新しいMethod#getAnnotatedReturnTypeありますので、私はParameterizedTypeは今、ジェネリック型引数に同じことをするだろうgetActualAnnotatedTypeArgumentsのようなものを持っているでしょう期待していたが、それは存在しません

+3

私はそれをチェックする時間がありませんが、Typeの1つのサブタイプは、AnnotatedElementを拡張するTypeVariableです。それはあなたが必要とするものを持っていますか? – yshavit

+1

ああ、それを見つけた!正しい新しい型はAnnotatedParameterizedTypeです。デバッグによって見つけました。正しい方向に私を振ってくれてありがとう! – kaqqao

+0

@yshavitこれを指摘してくれてありがとう!与えられたクラスの注釈付き型パラメータを取得する方法は非常にわかりませんでした。 – kaqqao

答えて

4

新しいAPIがinstanceof秒の多くを必要とするの伝統を継続し、タイプがキャスト:

import java.lang.annotation.*; 
import java.lang.reflect.*; 
import java.util.*; 
import java.util.stream.*; 

public class AnnoTest { 
    @Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.TYPE_USE) 
    @interface NonNull {} 

    @Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.TYPE_USE) 
    @interface NonEmpty {} 

    List<@NonNull String> list; 
    Map<@NonNull Integer, @NonNull @NonEmpty Set<String>> map; 
    Object plain; 

    public static void main(String[] args) throws ReflectiveOperationException { 
     for(Field field: AnnoTest.class.getDeclaredFields()) { 
      AnnotatedType at = field.getAnnotatedType(); 
      System.out.println(formatType(at)+" "+field.getName()); 
     } 
    } 
    static CharSequence formatType(AnnotatedType type) { 
     StringBuilder sb=new StringBuilder(); 
     for(Annotation a: type.getAnnotations()) sb.append(a).append(' '); 
     if(type instanceof AnnotatedParameterizedType) { 
      AnnotatedParameterizedType apt=(AnnotatedParameterizedType)type; 
      sb.append(((ParameterizedType)type.getType()).getRawType().getTypeName()); 
      sb.append(Stream.of(apt.getAnnotatedActualTypeArguments()) 
       .map(AnnoTest::formatType).collect(Collectors.joining(",", "<", ">"))); 
     } 
     else sb.append(type.getType().getTypeName()); 
     return sb; 
    } 
} 

は、型変数、ワイルドカードの種類や配列などの他のシナリオを扱う例えばまたthis answerの最後を参照してください。

3

実際にはgetAnnotatedActualTypeArgumentsというメソッドがありますが、AnnotatedParameterizedTypeには、ParameterizedTypeにはありませんでした。

関連する問題