elv*_*mar 5 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");
Run Code Online (Sandbox Code Playgroud)
Fre*_* LS 29
您是否使用保留策略注释了注释?如果未设置保留策略,则默认保留策略行为是注释由编译器读取并保留在生成的.class文件中,但在运行时期间不可访问.如果在运行时需要注释,则需要使用以下注释注释注释:
@Retention(RetentionPolicy.RUNTIME)
Run Code Online (Sandbox Code Playgroud)
您的测试的类加载器可能与Id不同loader。
快速检查方法:
...
Class idType = loader.loadClass("my.package.Id");
...
field.isAnnotationPresent(idType);
Run Code Online (Sandbox Code Playgroud)
如果有效,那么您就遇到了类加载器问题——更具体地说,您loader没有使用测试用例的加载器。要修复,请使用不同的构造函数:
ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
Run Code Online (Sandbox Code Playgroud)