当前位置: 首页 > 知识库问答 >
问题:

如何从jar文件中的类中获取注释的参数

顾俊哲
2023-03-14

我想通过java反映获得一个类的(打包在jar文件中)注释参数。

>

  • 我这样的注释

    @Documented
    @Retention(RUNTIME)
    @Target(TYPE)    
    public @interface TestPlugin {
        public String moduleName();
        public String plugVersion();
        public String minLeapVersion();    
    }
    

    我的班级是这样的

    @TestPlugin(moduleName="xxx", plugVersion="1.0.0", minLeapVersion="1.3.0")
    
    public class Plugin {
    
      ......
    
    }
    

    我的密码是这样的

    Class<?> clazz = this.loadClass(mainClassName);  // myself classloader
    
    Annotation[] annos = clazz.getAnnotations();
    
    for (Annotation anno : annos) {
        Class<? extends Annotation> annoClass = anno.annotationType();
    
        /* Question is here
        This code can get right annotationType: @TestPlugin. 
        Debug windows show anno is $Proxy33. 
        But I can't find any method to get annotation membervalues even though I can find them in debug windows.
        How can I get annotation's parameters?
        */
    }
    

    调试windows信息

  • 共有1个答案

    李森
    2023-03-14

    出于某些技术原因,Java VM使用的“真实”注释类是动态代理。这不应该打扰你。它们仍然“实现”您的注释类。使用

    TestPlugin plugin = clazz.getAnnotation(TestPlugin.class);
    
    plugin.getClass() == TestPlugin.class; // false - is Dynamic proxy
    TestPlugin.class.isAssignableFrom(plugin.getClass()); // true - Dynamic proxy implements TestPlugin interface
    

    编辑:刚刚在另一个答案中发现,您也可以询问循环中的anno对象,但不要使用getClass()。使用。annotationType()

     类似资料:
    • 我有一门课,比如下面的测试 有一个C1班 我给这门课打电话如下 当我调试时,我将i1设置为null。 请告知我做错了什么 注意:。我必须在xyx()中使用类Test,因为它是伪代码,并且xyx()中有很多代码

    • 问题内容: 我创建了自己的注释类型,如下所示: 并将其附加到一个类上: 我试图通过反射来获得类注释,如下所示: 但它没有打印任何内容。我究竟做错了什么? 问题答案: 默认的保留策略是,默认情况下,注释信息在运行时不保留: 批注由编译器记录在类文件中,但VM在运行时无需保留。这是默认行为。 而是使用: 注释将由编译器记录在类文件中,并在运行时由VM保留,因此可以通过反射方式读取它们。 …您使用met

    • 问题内容: 如何从Java源文件中提取JavaDoc注释?以及按照我的意愿格式化它们? 问题答案: 有关标准方法,请参见Javadoc工具主页的 Doclets 部分。 Doclet 标准doclet生成HTML,并内置在Javadoc工具中。这里列出了Java软件开发的其他doclet。.. 尤其参见示例- 子类化标准Doclet 和Doclet API 。

    • 我有一个kotlin类,它的属性有一个Java的注释,但是我不能用Java反射访问这些注释: 以下测试打印为空: 如何获取给定kotlin属性的注释?

    • 问题内容: 我想读取一个文件,该文件位于类路径中所包含的 之一内。我如何读取其中包含的任何文件? 问题答案: 如果要从应用程序内部读取该文件,请使用: 路径以“ /”开头,但这不是文件系统中的路径,而是类路径中的路径。因此,如果你的文件位于类路径“ org.xml”中,并且名为myxml.xml,则路径类似于“ /org/xml/myxml.xml”。 InputStream读取文件的内容。如果需

    • 考虑下面的代码: 使用用于注释处理的最新JDK8 API,如何访问注释列表(@JSON,@freezed) 我尝试过很多技巧,比如