[Java] 클래스 파일 디스어셈블러 The Java Class File Disassembler
참고 문서
클래스 파일의 바이트 코드를 확인할 수 있는 명령어. 컴파일 후 사용한다.
syntax
javap -c 클래스명
example
javac TestClass.java
javap -c TestClass
# Compiled from "TestClass.java"
# public class TestClass {
# public TestClass();
# Code:
# 0: aload_0
# 1: invokespecial #1 // Method java/lang/Object."<init>":()V
# 4: return
#
# public java.lang.String concatTest1();
# Code:
# 0: ldc #2 // String 111222333
# 2: astore_1
# 3: aload_1
# 4: areturn
#
# public java.lang.String concatTest2();
# Code:
# 0: ldc #3 // String 444
# 2: astore_1
# 3: new #4 // class java/lang/StringBuilder
# 6: dup
# 7: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
# 10: aload_1
# 11: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
# 14: ldc #7 // String 555
# 16: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
# 19: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
# 22: astore_1
# 23: new #4 // class java/lang/StringBuilder
# 26: dup
# 27: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
# 30: aload_1
# 31: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
# 34: ldc #9 // String 666
# 36: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
# 39: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
# 42: astore_1
# 43: aload_1
# 44: areturn
#
# public java.lang.String concatTest3();
# Code:
# 0: ldc #10 // String 777
# 2: ldc #11 // String 888
# 4: invokevirtual #12 // Method java/lang/String.concat:(Ljava/lang/String;)Ljava/lang/String;
# 7: ldc #13 // String 999
# 9: invokevirtual #12 // Method java/lang/String.concat:(Ljava/lang/String;)Ljava/lang/String;
# 12: astore_1
# 13: aload_1
# 14: areturn
# }
여기서 사용한 TestClass는 요렇게 생겼다:
public class TestClass {
public String concatTest1() {
String str = "111" + "222" + "333";
return str;
}
public String concatTest2() {
String str = "444";
str += "555";
str += "666";
return str;
}
public String concatTest3() {
String str = "777".concat("888").concat("999");
return str;
}
}
참고
Java 1.8인가 1.7인가 부터 문자열 + 연산을 컴파일러가 알아서 StringBuilder를 사용하도록 바꿔줌.