gpt4 book ai didi

java - 是否可以在运行时访问类型参数上的注释?

转载 作者:行者123 更新时间:2023-12-01 14:09:20 25 4
gpt4 key购买 nike

Java 8 允许以下内容:

public List<@NonNull String> names;

但是有没有办法在运行时访问这个注解,还是只对编译器插件可用?

有新的 Method#getAnnotatedReturnType 提供对返回类型注释的访问,所以我希望 ParameterizedType 现在有类似 getActualAnnotatedTypeArguments 的东西,可以对泛型类型参数做同样的事情,但它不存在......

最佳答案

新 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 的结尾,了解处理其他场景(如类型变量、通配符类型和数组)的示例。

关于java - 是否可以在运行时访问类型参数上的注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38486360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com