我有一个类文件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");
答案 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(),请在目标接口而不是实现类上添加注释。