为了理解 Java 注释,我尝试了一些操作并得到了一些疑问,即使查看执行我仍然感到困惑。这就是我正在做的事情。定义注解
@Retention(RetentionPolicy.CLASS)
@Target(value=ElementType.TYPE)
public @interface Command {
}
现在我初始化命令
Reflections reflections = new Reflections(CMDS_PACKAGE);
Set<Class<?>> allClasses = reflections.getTypesAnnotatedWith(Command.class); // line 2
for (Class clazz : allClasses) {
MYCommand cmd = (MYCommand) clazz.newInstance();
System.out.println(cmd.getClass().getAnnotation(Command.class));// line 6
log.info("loading Command [ {} ]", clazz.getCanonicalName());
}
当我运行程序第 6 行显示null
。当策略为 RetentionPolicy.RUNTIME
第 6 行时,显示正确的命令。
在此过程中,第 2 行仍然给我正确的 Annotated 类,而不管政策如何。那么这是否意味着反射库忽略了RetentionPolicy
即使阅读了大多数教程,我也很困惑。
我的问题实际上是,为什么这是不同的行为?当用策略注释时RetentionPolicy.CLASS
它不应该在运行时给我。我的理解是否错误,或者任何人都可以分享对这两者的理解的宝贵意见。