Я новичок в ASM. У меня есть файл класса, в котором у меня есть видимые аннотации времени выполнения для методов. Я хочу проанализировать этот файл класса и выбрать аннотацию в соответствии с конкретными критериями. Я просмотрел документацию ASM и попытался с помощью visibleAnnotation. Я не могу напечатать список аннотаций метода, который я могу видеть в своих файлах классов.Как напечатать RuntimeVisibleАннотации в java ASM
Мой код в
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import org.objectweb.asm.tree.AnnotationNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.ClassReader;
public class ByteCodeParser {
public static void main(String[] args) throws Exception{
InputStream in=new FileInputStream("sample.class");
ClassReader cr=new ClassReader(in);
ClassNode classNode=new ClassNode();
//ClassNode is a ClassVisitor
cr.accept(classNode, 0);
//
Iterator<MethodNode> i = classNode.methods.iterator();
while(i.hasNext()){
MethodNode mn = i.next();
System.out.println(mn.name+ "" + mn.desc);
System.out.println(mn.visibleAnnotations);
}
}
}
Выход:
<clinit>()V
null
<init>()V
null
MyRandomFunction1()V
[[email protected]]
MyRandomFunction2()V
[[email protected]]
Мой RandomFunction 1 & 2 имеет аннотаций, но я не могу понять [org.objectweb.asm.tree. AnnotationNode @ 5674cd4d].
Нет необходимости писать такой подробный код «Итератор» уже более десяти лет. Просто напишите 'if (mn.visibleAnnotations! = Null) для (AnnotationNode an: mn.visibleAnnotations) System.out.println (an.values);'. Но я бы рекомендовал реализовать собственный 'ClassVisitor', который печатает аннотации прямо, когда встречается, вместо того, чтобы собирать всю информацию о классе и итерации по немногим, в которых вы заинтересованы. – Holger
Я сначала попытался использовать для каждого цикла, но произошла ошибка с несоответствием типа. «Невозможно преобразовать объект типа элемента в узел« Аннотации ». поэтому я использовал итератор вместо этого. – user225008