下面显示的带注释的类存在于 MySample 项目中
@Description(name = "foo", description = "bar")
public class Test {
//////
}
在下面的代码中从 jar 中获取值
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,我无法获取值。
有人知道如何解决这个问题或任何其他替代方案吗?
最佳答案
首先,确保Description
具有@Retention(RetentionPolicy.RUNTIME)
。
如果您已经有了这个,那么会发生两个不同的类加载器正在加载 Description
类。第一个是您创建的 URLClassLoader
(cl
),第二个是您的普通应用程序类加载器。当您调用 getAnnotation(Description.class)
时,您会向 cl
加载的类询问应用加载的注释类。加载器,并且由于这些类是由其加载器标识的,因此这两个类实际上是完全不同的类,因此比较失败并且您不会得到任何结果。
现在的问题是,为什么你首先要以这种复杂的方式加载这个 jar ?为什么需要自己的类加载器实例?
如果您尝试过类似的操作:ClassLoader cl = this.getClass().getClassLoader()
这可能会起作用。但只有在运行时将 jar id 添加到类路径中才有意义。
否则,Test.class.getAnnotation(Description.class)
(没有类加载器业务)会更有意义。
关于java - 无法从 JAR 文件获取带注释的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46338768/