2012-03-23 37 views
5

我有一个类文件test.class。在该文件中有注释@Id@Entity。但是,当我使用方法field.isAnnotationPresent(Id.class)检查注释时,它将返回false。我正在获取字段变量中的所有字段。为什么AnAnnotationPresent(Id.class)不能用于类文件

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

更新:现在用下面的代码来获取类

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

你能告诉我们那些不适合你的代码吗? – 2012-03-23 08:39:13

回答

1

你测试的类加载器可能有不同的Idloader的。

一个快速的方法来检查:

... 
Class idType = loader.loadClass("my.package.Id"); 
... 
field.isAnnotationPresent(idType); 

如果这样的作品,那么你有一个类加载器的问题 - 更具体地说,你loader不使用你的测试用例的装载机。要修复,使用不同的构造函数:

ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader()); 
+0

你是对的我改变了ClassLoader constructer.Now它的工作完全非常感谢你。 – elvisanandkumar 2012-03-24 01:54:42

1

它的工作原理一般。这是一个工作示例:

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)。

25

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

@Retention(RetentionPolicy.RUNTIME) 
+0

'@ Id'和'@ Entity' * do * have'RetentionPolicy.RUNTIME' – skaffman 2012-03-23 09:56:12

+0

它是JPA注释吗? – 2012-03-23 10:12:47

+1

谢谢,我错过了我的代码中的retentionpolicy,并且遇到类似的问题。 – Keshav 2014-06-13 09:59:16

0

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

相关问题