2014-11-02 3 views
0

Как использовать класс класса bcel для получения имен классов, имен элементов и имен методов? У меня уже есть способ получить имена классов, но имена элементов и методов дают мне что-то неправильно. Кто-нибудь может мне помочь? вот мой код (с некоторыми ошибками там, и не завершено):BCEL - Получить имя класса, имена элементов и имена методов

import java.io.IOException; 
import java.util.Enumeration; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 

import org.apache.bcel.classfile.ClassParser; 
import org.apache.bcel.generic.ConstantPoolGen; 

public final class BcelTest 
{ 
    // static int methods; 

    public static void main(String[] args) 
    { 
     ClassParser parser; 
     try 
     { 

      JarFile jar = new JarFile("C:\\Users\\OOO\\Desktop\\Sample.Jar"); 
      Enumeration<JarEntry> entries = jar.entries(); 
      ConstantPoolGen cpg = jar.entries(); 
      while (entries.hasMoreElements()) 
      { 
       JarEntry entry = entries.nextElement(); 
       if (!entry.getName().endsWith(".class")) 
        continue; 

       parser = 
        new ClassParser("C:\\Users\\OOO\\Desktop\\Sample.Jar", 
         entry.getName()); 
       methods = getMethodName(cpg); 

       MyClassVisitor visitor = new MyClassVisitor(parser.parse()); 
       visitor.start(); 
      } 

     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public String getMethodName(ConstantPoolGen cpg) 
    { 
     return getMethodName(cpg); 
    } 
} 

ответ

1

Вы можете позвонить parse() на JavaParser получить JavaClass класс, который предлагает всю необходимую информацию:

import java.io.IOException; 
import java.util.Enumeration; 
import java.util.jar.JarEntry; 
import java.util.jar.JarFile; 

import org.apache.bcel.classfile.ClassParser; 
import org.apache.bcel.classfile.Field; 
import org.apache.bcel.classfile.JavaClass; 
import org.apache.bcel.classfile.Method; 

public final class BcelTest 
{ 
    public static void main(String[] args) 
    { 
     JarFile jar = null; 
     try 
     { 
      String jarName = "C:/theFile.jar"; 
      jar = new JarFile(jarName); 
      Enumeration<JarEntry> entries = jar.entries(); 
      while (entries.hasMoreElements()) 
      { 
       JarEntry entry = entries.nextElement(); 
       if (!entry.getName().endsWith(".class")) 
       { 
        continue; 
       } 

       ClassParser parser = 
        new ClassParser(jarName, entry.getName()); 
       JavaClass javaClass = parser.parse(); 

       System.out.println("Class: "+javaClass.getClassName()); 
       System.out.println(" Fields:"); 
       for (Field field : javaClass.getFields()) 
       { 
        System.out.println(" "+field); 
       } 
       System.out.println(" Methods:"); 
       for (Method method : javaClass.getMethods()) 
       { 
        System.out.println(" "+method); 
       } 
      } 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if (jar != null) 
      { 
       try 
       { 
        jar.close(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

большой , но как найти отношения между этими классами? определить, создается ли класс из файла jar другого класса или существуют ли вызовы методов другим объектам класса или другим объектам класса? см. здесь: http: //stackoverflow.com/questions/26760153/parse-jar-file-and-find-relationships-between-classes – YDev