javap的以可编程方式(javap in a programmable way)

2019-07-18 11:51发布

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

例如,下面的代码:

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常量池?

Answer 1:

Apache的BCEL提供.class文件的解析,它提供了一套API的封装。 几乎在.class文件的每一个元素,有一个在BECL API相应的类来代表它。 因此,在某种程度上,它不是那么简单,如果你只是想打印出来的类文件的某些部分。 这里是你可以参考,留意一个简单的例子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.
    }


Answer 2:

这里是javap的内部没有API,但你可以看看javap的源代码,这是在包com.sun.tools.javap 。 入门级是com.sun.tools.javap.Main 。 因此,另一种方式来运行的javap是java -cp $JAVA_HOME/lib/tools.jar com.sun.tools.javap.Main YourTestClass



文章来源: javap in a programmable way
标签: java api javap