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 はありませんが、パッケージ内にある 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は、一連の API を提供する .class ファイル解析のカプセル化を提供します。.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.
    }
于 2013-01-22T04:17:17.067 に答える