5

我们可以以可编程的方式在我们自己的 java 代码中使用 javap 吗?

例如,下面的代码:

public class TestClass {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

在命令行中使用 javap,我们得到:

// Header + consts 1..22 snipped
const #22 = String      #23;    //  hello world
const #23 = Asciz       hello world;

public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic       #16; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #22; //String hello world
   5:   invokevirtual   #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return
  // Debug info snipped
}

我可以使用 javap 的 API 只打印常量池吗?

4

2 回答 2

6

javap 内部没有 API,但您可以在 package 中查找 javap 的源代码com.sun.tools.javap。入口类是com.sun.tools.javap.Main. 所以另一种运行 javap 的方法是java -cp $JAVA_HOME/lib/tools.jar com.sun.tools.javap.Main YourTestClass

于 2013-11-21T03:58:39.953 回答
2

Apache BCEL提供了对.class 文件解析的封装,提供了一套API。几乎对于 .class 文件中的每个元素,BECL API 中都有一个对应的 Class 来表示它。所以在某种程度上,如果你只想打印出类文件的某些部分,这并不是那么简单。这是一个简单的例子,你可以参考,注意org.apache.bcel.classfile.ClassParser

    ClassParser cp = new ClassParser("TestClass.class");
    JavaClass jc = cp.parse();
    ConstantPool constantPool = jc.getConstantPool(); // Get the constant pool here.
    for (Constant c : constantPool.getConstantPool()) {
        System.out.println(c); // Do what you need to do with all the constants.
    }
于 2013-01-22T04:17:17.067 回答