新しい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の最後を参照してください。
私はそれをチェックする時間がありませんが、Typeの1つのサブタイプは、AnnotatedElementを拡張するTypeVariableです。それはあなたが必要とするものを持っていますか? – yshavit
ああ、それを見つけた!正しい新しい型はAnnotatedParameterizedTypeです。デバッグによって見つけました。正しい方向に私を振ってくれてありがとう! – kaqqao
@yshavitこれを指摘してくれてありがとう!与えられたクラスの注釈付き型パラメータを取得する方法は非常にわかりませんでした。 – kaqqao