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。
有没有人知道如何解决这个问题或任何其他替代方案?
答案 0 :(得分:0)
首先,确保Description
有@Retention(RetentionPolicy.RUNTIME)
。
如果您已经拥有此功能,那么会发生两个不同的类加载器正在加载Description
类。第一个是您创建的URLClassLoader
(cl
),第二个是您的普通应用程序类加载器。当您调用getAnnotation(Description.class)
时,您要求cl
加载的类为应用程序加载的注释类。加载器,并且由于类是由它们的加载器标识的,因此这两个类实际上是完全不同的类,因此比较失败并且没有结果。
现在,问题是为什么你首先以这种错综复杂的方式装载这个罐子?为什么需要自己的类加载器实例?
如果您尝试过类似:ClassLoader cl = this.getClass().getClassLoader()
这样的话可能会有效。但是只有在运行时将jar id添加到类路径中才有意义。
否则,Test.class.getAnnotation(Description.class)
(没有类加载器业务)会更有意义。