当前位置: 首页 > 知识库问答 >
问题:

Java反射:类注释在运行时意外返回null

水麒
2023-03-14

我正在尝试在运行时向类动态添加注释,如以下问题所示:在运行时修改类定义的注释字符串参数

但是,“annotations”字段将返回null。事实上,根据调试器,除了“declaredFields”和“name”之外,类上的所有内容都返回null。我正在使用Java 7。

这是我的代码:

Field field = Class.class.getDeclaredField("annotations");
field.setAccessible(true);
Map<Class<? extends Annotation>, Annotation> annotations = 
    (Map<Class<? extends Annotation>, Annotation>) 
        field.get(clazz);
annotations.put(JsonIdentityInfo.class, newAnnotation);

共有1个答案

谷梁卓
2023-03-14

似乎类字段注释是懒惰构建的,您首先需要强制其初始化:

JsonIdentityInfo.class.getAnnotations();

然后继续你的代码

 类似资料:
  • 但是,由于某种原因,总是,所以我不确定这是注释类的问题还是我使用反射的方式的问题。我很确定是后者,因为在调试时,我发现它能够访问带有注释的方法。如有任何帮助,不胜感激,谢谢!

  • 我试图弄清楚使用运行时级别保留注释(例如:@javax.inject.named)注释的类在编译时和运行时类路径方面的确切影响。这是我到目前为止的理解: null 如果是这种情况,我是否需要创建一个包装对象(用@javax.inject.named注释)来委托内部的、未注释的对象?是否还有一个在编译时禁用注释处理的选项?参见http://docs.oracle.com/javase/7/docs/

  • 下面的代码被认为是运行时反射还是类型内省? 我想在编译阶段使用它,不想在运行时使用任何资源(包括时间)。它是否使用任何运行时资源?

  • 在python 3.x中,通常使用函数的返回类型注释,例如: “void”类型的正确注释是什么? 我正在考虑三种选择:

  • 问题内容: 我正在尝试使用Java的SimpleDateFormat来解析带有以下代码的日期字符串。 我期待一些解析错误。但有趣的是,它打印以下字符串。 无法推理出来。有人可以帮忙吗? 谢谢 问题答案: 已将其解析为 月份 号2011,因为month()是日期模式的第一部分。 如果将2011个月加到28年,则得到195年。 2011个月是167年零7个月。七月是第七个月。您将02指定为日,将28指

  • 我正在使用反射在类中查找方法,并获得注释“Permes siNecessari”,该注释描述了方法实现的操作类型(CREATE,DELETE,...)。 这是一个实现picketlink类PathAuthorzer的授权检查。我得到一个叫做url,我把它拆分,从url中我找到了实现网络服务的类。然后我搜索它将被调用的方法,并阅读它使用的操作类型。 这是搜索方法的一部分: 对于istance,这是选