为了理解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。

高温超导

09-16 16:07