java - 无法从 JAR 文件获取带注释的值

标签 java reflection annotations

下面显示的带注释的类存在于 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/

相关文章:

java - Objects getClass().getMethod 有什么用?

.net - 使用 VB.Net 获取实现特定接口(interface)的所有类类型

java - 如何找到桥接方法的声明方法?

java - Hibernate 4 - 可以向 @ManyToMany Hibernate 额外表添加额外字段吗?

c# - MVC 客户端错误消息未显示

java - 我将小程序保存在 tomcat 中的什么位置?

java - 如何在读取文件并创建 .bmp 图像时继续下一行?

spring - @Autowired 注释应该放在哪里 - 在属性或方法上?

java - 使用 Java、JavaScript、Oracle 和 Windows 计算器进行乘法

java - Jasypt CLI 错误 无法操作(错误的输入或参数)