我们可以通过编程方式在自己的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仅打印常量池吗?
Apache BCEL提供.class文件解析的封装,该封装提供了一组API。几乎对于.class文件中的每个元素,BECL API中都有一个对应的Class来表示它。因此,从某种角度来说,如果您只想打印出类文件的某些部分,那就不是那么简单。这是您可以参考的简单示例,请注意org.apache.bcel.classfile.ClassParser:
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. }