2013-01-21 1 views
2

프로그래밍 방식으로 자바 코드에서 javap을 사용할 수 있습니까?프로그래밍 방식으로 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를 사용하여 인쇄 할 수 있습니까?

+0

입니다. 클래스 파일 구조에 대해 배울 수있는 좋은 기회입니다. –

+0

하지만 난 그냥 내 자신의 목적을 위해 상수 풀과 같은 전체 구조 대신 클래스 파일의 일부를 검색하고 싶습니다. 어떤 단서가 있습니까? – DON1101

+0

반사? –

답변

2

Apache BCEL은 API 세트를 제공하는 .class 파일 구문 분석의 캡슐을 제공합니다. .class 파일의 거의 모든 요소에 대해 BECL API에 상응하는 Class가 있습니다. 따라서 어떤면에서는 클래스 파일의 특정 섹션을 인쇄하려는 경우 간단하지 않습니다. 다음은 org.apache.bcel.classfile.ClassParser에, 참조주의를 지불 할 수있는 간단한 예입니다 :이은 javap 내부에 대한 API가 없지만, 패키지 com.sun.tools.javap에은 javap의 소스 코드를 찾아보실 수 있습니다

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. 
    } 
+0

멋지다! 나는 그것이 내가 원하는 것을 정확하게 생각한다. 고마워요 개빈! – DON1101

3

. 엔트리 클래스는 com.sun.tools.javap.Main입니다. javap을 실행하는 다른 방법은 java -cp $JAVA_HOME/lib/tools.jar com.sun.tools.javap.Main YourTestClass

+0

많은 기능이 필요없는 경우를위한 아주 멋진 솔루션 –

+0

이것은 클래스 파일의 모든 종속성을 가지지 않고 메소드 서명을 구문 분석하는 데 많은 도움이되었습니다! 왜냐하면'Class.forName (...) '을 사용한 리플렉션은 런타임에 모든 의존성을 갖기를 원하기 때문입니다. – bobbel