为了理解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行仍然为我提供了正确的带注释的类,与策略无关。这是否意味着反射Library忽略了
RetentionPolicy
即使阅读了大多数教程,我也很困惑。
对我来说实际上的问题是,为什么这种不同的行为?用
RetentionPolicy.CLASS
policy注释时,它在运行时不应该给我。我的理解是错误的,还是任何人都可以在那里分享对这两者的理解的宝贵意见。 最佳答案
是的,Reflections library(不是反射,而是反射* s *)默认情况下不会忽略注释的可见性。
可以使用org.reflections.adapters.JavassistAdapter#includeInvisibleTag标志进行更改。就像是:
JavassistAdapter mdAdapter = new JavassistAdapter();
mdAdapter.includeInvisibleTag = false;
new Reflections(new ConfigurationBuilder()
...
.setMetadataAdapter(mdAdapter)
...
另一种选择是改为使用JavaReflectionAdapter。
高温超导