java - Java Annotation如何获取特定注解的当前ElemenType
问题描述
我的注释:
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectName {
String name() default "";
String field() default "";
}
一些带有我注释的课程
@ObjectName("a_")
public class A {
@ObjectName("field_")
String filed;
}
问题 - 当我从上面的类中获取所有“ObjectName”注释时,如何获取注释的 ElementType 值(字段、类或方法类型)?
所以我想要这样的东西
public void process(Class<?> clazz) {
Annotation[] annotations = clazz.getAnnotations();
for (Annotation anno : annotations) {
if (anno instanceof ObjectName) {
ObjectName annObjName = (ObjectName) anno;
Target target = anno.getAnnotation(Target.class);
if (target.getType().equals(ElementType.TYPE)
doThat(annObjName.name());
else if (target.getType().equals(ElementType.FIELD)
doThis(annObjName.field());
}
}
}
- 我什至可以这样做吗?
- 我该怎么做,或者我怎么知道这个注释是否在归档或类上声明?
解决方案
你不能。
您所能做的就是查看您调用的位置getAnnotations()
,因为您似乎错误地认为clazz.getAnnotations()
它将返回类中所有内容的所有注释。那是错误的。当您调用时clazz.getAnnotations()
,您只会直接在类上获取注释。要获取字段注释,您必须调用clazz.getFields()
,然后调用getAnnotations()
元素Field
。因此,只要您保持正确,就没有将它们混淆的风险。
推荐阅读
- swift - 当 url 包含国际化域名 (IDN) 时,Swift URL 返回 nil
- github - 如何取消查看/切换 GitHub 拉取请求上的所有已查看文件?
- python - ModuleNotFoundError:在 jupyter notebook 中安装的包没有名为“xgboost”的模块错误
- javascript - componentWillUpdate 被无限调用,即使有条件
- java - 无法处理 jar 文件中的按钮单击
- wso2 - 第一个使用 WSO2 APIM 4.0.0 的 API,创建似乎很好,但尝试调用 API 时出现 HTTP 404
- javascript - Jest 测试运行器在测试字符串中的某些字符上失败
- scikit-learn - scikit-learn GridSearchCV 与管道作为估计器:如何在管道中获取估计器的属性?
- javascript - 使用 JSX 作为字符串反应组件内容
- r - R FuzzyJoin by 带有变量的子句