2015-10-26 1 views
0

Я новичок в 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].

ответ

0

Я сам решил эту проблему, мне пришлось перебирать аннотации, которые я не понимал первоначально.

if (mn.visibleAnnotations != null) { 
      Iterator<AnnotationNode>j=mn.visibleAnnotations.iterator(); 
      while (j.hasNext()) { 
       AnnotationNode an=j.next(); 
       System.out.println(an.values); 

      } 
} 
+1

Нет необходимости писать такой подробный код «Итератор» уже более десяти лет. Просто напишите 'if (mn.visibleAnnotations! = Null) для (AnnotationNode an: mn.visibleAnnotations) System.out.println (an.values);'. Но я бы рекомендовал реализовать собственный 'ClassVisitor', который печатает аннотации прямо, когда встречается, вместо того, чтобы собирать всю информацию о классе и итерации по немногим, в которых вы заинтересованы. – Holger

+0

Я сначала попытался использовать для каждого цикла, но произошла ошибка с несоответствием типа. «Невозможно преобразовать объект типа элемента в узел« Аннотации ». поэтому я использовал итератор вместо этого. – user225008

Смежные вопросы