【发布时间】:2015-03-03 22:49:29
【问题描述】:
我不太清楚如何简洁地描述这个问题,所以请多多包涵。
我正在研究将我们的应用程序从 Java 7 升级到 Java 8。该应用程序依赖于使用反射来动态创建各种业务实体的实例(所谓的"Adaptive Object Model")。当我尝试使用最新的 Java 8 (Oracle 1.8.0_25) 构建应用程序时,一些测试开始失败。具体来说,有一个测试检查“测试实体”中的 getter 方法是否使用特定注释进行注释,并且测试失败,因为未找到注释。超级“实体”类具有一些适用于所有实体实例(名称、描述、显示名称等)的通用字段,并且在测试类中,“测试实体”扩展了“实体”并覆盖了一种 getter 方法(getDisplayName ) 并添加一个额外的注释:
static class EntityWithCompositeDisplayName extends Entity {
@CompositeProperty("${name} - ${description}")
@Override
public String getDisplayName() {
return super.getDisplayName();
}
}
@CompositeProperty 是我们自己的注解。它有一个 METHOD 目标和 RUNTIME 保留。
测试调用如下代码查看注解是否存在:
CompositeProperty compositeProperty = propd.getReadMethod().getAnnotation(CompositeProperty.class);
"compositeProperty" 在 Java 8 中返回 null,但在 Java 7 中不返回 null。但是,如果我尝试 getAnnotation() 获取在 super getDisplayName() 方法上声明的注释之一,那就没问题了。同样,如果我将 CompositeProperty 注释移动到超类,则测试通过,但实际上这不是一个选项。谁能解释这种行为?
【问题讨论】:
-
我很想知道
propd.getReadMethod().isAnnotationPresent(CompositeProperty.class)是否返回true。或者,即使Override.class出现。您是否尝试过其他注释?您是否尝试过使用getDeclaredAnnotation()? -
@XaeroDegreaz:不,错误。覆盖也是错误的。但是我取得了一些进展:我忘了提到 EntityWithCompositeDisplayName 类是在测试类中声明的内部类。如果我将课程提取到顶级课程,则测试通过!所以这与内部类的重写方法的注释有关......
-
这对我来说听起来像是一个错误,您可能需要考虑使用 oracle 提交它
-
@MarkRotteveel 谢谢。我已将其报告为错误。我想我现在只需要使用解决方法。
标签: java reflection annotations