java - 使用 Apache Bcel 库读取注释

标签 java annotations bcel

我正在尝试使用以下代码读取类注释:

JavaClass jclas = new ClassParser("src\\test\\org\\poc\\TargetHello.class").parse();

        ClassGen cg = new ClassGen(jclas);

        Attribute[] attributes = cg.getAttributes();

        for (Attribute attribute : attributes) {
            if (attribute instanceof Annotations) {
                Annotations annotations = (Annotations) attribute;
                AnnotationEntry[] entries= annotations.getAnnotationEntries();
            }
        }

但是对于这段代码attribute instanceof Annotations我收到错误:Inconvertible types;无法将“com.sun.org.apache.bcel.internal.classfile.Attribute”转换为“org.apache.bcel.classfile.Annotations”

你知道我该如何解决这个问题吗?

最佳答案

这对我有用。您没有给出完整的可编译示例,也没有说明您运行了哪些命令。这就是我所做的。

文件Hello.java:

@Deprecated
public class Hello {
  public static void main(String[] args) {}
}

文件AttributeAnnotations.java:

import java.io.IOException;
import org.apache.bcel.classfile.AnnotationEntry;
import org.apache.bcel.classfile.Annotations;
import org.apache.bcel.classfile.Attribute;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.generic.ClassGen;

public class AttributeAnnotations {

  public static void main(String[] args) throws IOException {

    JavaClass jclas = new ClassParser("Hello.class").parse();

    ClassGen cg = new ClassGen(jclas);

    Attribute[] attributes = cg.getAttributes();

    for (Attribute attribute : attributes) {
      System.out.println("attribute: " + attribute);
      if (attribute instanceof Annotations) {
        Annotations annotations = (Annotations) attribute;
        System.out.println("annotations: " + annotations);
        AnnotationEntry[] entries = annotations.getAnnotationEntries();
      }
    }
  }
}

要运行的命令:

wget https://repo1.maven.org/maven2/org/apache/bcel/bcel/6.4.1/bcel-6.4.1.jar
javac Hello.java
javac -cp bcel-6.4.1.jar AttributeAnnotations.java
java -cp .:bcel-6.4.1.jar AttributeAnnotations

所有命令均已完成且没有错误。

关于java - 使用 Apache Bcel 库读取注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61245667/

相关文章:

java - 用java语言从org.rda导入类

java - 没有找到适合 getAnnotation(Class<CAP#1>) 的方法

java - 我如何从普通类(java.lang.class<?>)对象中获取 javaclass(org.apache.bcel.classfile.JavaClass)

java - 使用 BCEL 时出现错误 "java.lang.VerifyError: StackMapTable error: bad offset"

java - 通过使用 BCEL 解析 Java 字节码来确定 LCOM4(方法中缺乏内聚)

java - 从一个 Activity 返回到另一个 Activity 时 fragment 可见

java - 奇怪的 Java 编码风格 - 为什么?

java - 如何将接口(interface)作为泛型类型传递并将其用作注释?

java - 为什么 AUTO_RESIZE_LAST_COLUMN 的作用与 AUTO_RESIZE_ALL_COLUMNS 类似?

java - 请求映射中的通配符