为什么isAnnotationPresent(Id.class)不适用于类文件

时间:2012-03-23 08:23:09

标签: java reflection annotations

我有一个类文件test.class。在该文件中,注释为@Id@Entity。但是当我使用方法field.isAnnotationPresent(Id.class)检查注释时,它会返回false。我得到了字段变量中的所有字段。

任何人都可以告诉我我做了什么错误。

更新:我使用以下代码获取类

File file=new File("D:/test/");
URL url=file.toURL();
URL[] urls=new URL[]{url};
ClassLoader loader=new URLClassLoader(urls);
Class cls=loader.loadClass("com.net.test.Test");

4 个答案:

答案 0 :(得分:29)

您是否使用保留政策对注释进行了注释?如果未设置保留策略,则默认保留策略行为是注释由编译器读取并保留在生成的.class文件中,但在运行时期间不可访问。如果在运行时需要注释,则需要使用以下命令注释注释:

@Retention(RetentionPolicy.RUNTIME)  

答案 1 :(得分:2)

一般情况下都有效。这是一个有效的例子:

import java.lang.reflect.Field;

public class AnnotationTest {

    @Deprecated
    public static int value = 1;

    public static void main(String[] args) throws Exception {
        Field field = AnnotationTest.class.getField("value");
        System.out.println(field.isAnnotationPresent(Deprecated.class));
    }
}

仔细检查您的类名和导入。也许你不小心检查了错误的Id.class(nameclash)。

答案 2 :(得分:2)

您的测试的类加载器可能与Id的{​​{1}}不同。

快速检查方法:

loader

如果可以,那么你就有了一个类加载器问题 - 更具体地说,你的... Class idType = loader.loadClass("my.package.Id"); ... field.isAnnotationPresent(idType); 没有使用你的测试用例的加载器。要修复,请使用其他构造函数:

loader

答案 3 :(得分:0)

如果在Spring AOP拦截器和proxyTargetClass = false中使用isAnnotationPresent(),请在目标接口而不是实现类上添加注释。