java - 注释不可见?

标签 java reflection annotations

这让我很困惑。我有一个带有自定义注释的类,但我似乎无法验证该注释是否存在。我在这里做错了什么?如果我运行 MyOperationTest(见下文),我将得到以下结果:

implements Library.Operation: true
has @Library.Marker: false
Tada!

库.java:

package com.example.gotchas;

public class Library {
    private Library() {}

    public @interface Marker {}

    public interface Operation {
        public void execute(); 
    }
}

MyOperation.java:

package com.example.gotchas;

@Library.Marker
public class MyOperation implements Library.Operation {
    @Override public void execute() {
        System.out.println("Tada!");
    }
}

MyOperationTest.java:

package com.example.gotchas;

public class MyOperationTest {
    static public void main(String[] args)
    {
        try {
            Class<?> cl = Class.forName("com.example.gotchas.MyOperation");
            boolean implementsLibraryOperation =
                Library.Operation.class.isAssignableFrom(cl);
            boolean hasLibraryMarker =
                cl.isAnnotationPresent(Library.Marker.class);
            System.out.println("implements Library.Operation: "
                    +implementsLibraryOperation);
            System.out.println("has @Library.Marker: "+hasLibraryMarker);
            if (implementsLibraryOperation)
            {
                Class<? extends Library.Operation> opClass = 
                    cl.asSubclass(Library.Operation.class); 
                Library.Operation op = opClass.newInstance();
                op.execute();
            }
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (InstantiationException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

最佳答案

你必须定义 @Retention为您的注释:

@Retention(RetentionPolicy.RUNTIME)
public @interface Marker {}

否则注释不会在运行时保留。

(如果你想限制你的注释只在类上使用,你也可以添加显式的@Target(ElementType.TYPE))

作为旁注 - 将注释定义为内部类并不是一种常见的做法。

关于java - 注释不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3688526/

相关文章:

java - 我可以使用 kerberos 在 jconsole 上进行身份验证吗?

java - 使用反射更改 Long.MIN_VALUE

objective-c - PDFAnnotationText 在 10.12 上不显示弹出窗口

java - 修改自定义注解的参数值

java - 更改卡片布局中的框架和焦点

java - 使用带有 Java 的 Selenium WebDriver 播放视频

java - 我可以泛化以下代码吗?

JavaScript 反射 : get variables

c# - 在 C# 中从程序集中提取类

Java注释或代码生成