无法从JAR文件中获取带注释的vales

时间:2017-09-21 08:14:21

标签: java reflection annotations

下面显示的

annoted类出现在MySample项目中

@Description(name = "foo", description = "bar")
public class Test {

    //////

}

从以下代码中的jar中获取vales

File file  = new File("MySample.jar");
    URL url = file.toURL();  
    URL[] urls = new URL[]{url};

    ClassLoader cl = new URLClassLoader(urls);
    Class cls = cl.loadClass("com.example.Test");
    Description annotations = cls.getClass().getAnnotation(Description.class);

    // annotations instance is null

由于注释实例为null,我无法获取vales。

有没有人知道如何解决这个问题或任何其他替代方案?

1 个答案:

答案 0 :(得分:0)

首先,确保Description@Retention(RetentionPolicy.RUNTIME)

如果您已经拥有此功能,那么会发生两个不同的类加载器正在加载Description类。第一个是您创建的URLClassLoadercl),第二个是您的普通应用程序类加载器。当您调用getAnnotation(Description.class)时,您要求cl加载的类为应用程序加载的注释类。加载器,并且由于类是由它们的加载器标识的,因此这两个类实际上是完全不同的类,因此比较失败并且没有结果。

现在,问题是为什么你首先以这种错综复杂的方式装载这个罐子?为什么需要自己的类加载器实例?

如果您尝试过类似:ClassLoader cl = this.getClass().getClassLoader()这样的话可能会有效。但是只有在运行时将jar id添加到类路径中才有意义。

否则,Test.class.getAnnotation(Description.class)(没有类加载器业务)会更有意义。