2014-11-02 175 views
0

如何使用bcel classparaser獲取類名稱,元素名稱和方法名稱?我已經找到了獲取類名的方法,但元素和方法名稱給我錯誤。 任何人都可以幫助我嗎? 這裏是我的代碼(有一些錯誤存在,並沒有完成):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 2014-11-05 15:07:18