클래스파일 보기
javap -c 클래스파일명(확장자빼고)
예) javap -c Sample
이클립스에서 보려면 네비게이터 뷰에서 타겟 폴더로 이동해서 보시면 되죠.
public class JavaPSample {
public void test(){
String a = "a";
String b = "b";
String c = a + b;
String d = "ab";
}
}
이 녀석을 컴파일 한 클래스의 모습니다.
// Compiled from JavaPSample.java (version 1.6 : 50.0, super bit)
public class sandbox.JavaPSample {
// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public JavaPSample();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 return
Line numbers:
[pc: 0, line: 3]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: sandbox.JavaPSample
// Method descriptor #6 ()V
// Stack: 3, Locals: 5
public void test();
0 ldc <String "a"> [16]
2 astore_1 [a]
3 ldc <String "b"> [18]
5 astore_2 [b]
6 new java.lang.StringBuilder [20]
9 dup
10 aload_1 [a]
11 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [22]
14 invokespecial java.lang.StringBuilder(java.lang.String) [28]
17 aload_2 [b]
18 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [31]
21 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [35]
24 astore_3 [c]
25 ldc <String "ab"> [39]
27 astore 4 [d]
29 return
Line numbers:
[pc: 0, line: 6]
[pc: 3, line: 7]
[pc: 6, line: 8]
[pc: 25, line: 9]
[pc: 29, line: 10]
Local variable table:
[pc: 0, pc: 30] local: this index: 0 type: sandbox.JavaPSample
[pc: 3, pc: 30] local: a index: 1 type: java.lang.String
[pc: 6, pc: 30] local: b index: 2 type: java.lang.String
[pc: 25, pc: 30] local: c index: 3 type: java.lang.String
[pc: 29, pc: 30] local: d index: 4 type: java.lang.String
}
중간에 보시면 StringBuilder의 append를 사용하는 모습을 볼 수 있는데, 한 줄에있는 + 연산은 StringBuilder의 append를 이용함을 알 수 있습니다. 따라서, 연달아 append를 할 경우에는 굳이 StringBuilder를 사용할 필요 없이 + 연산만으로도 충분할 것 같습니다.
앞에 숫자들은 라인 넘버인것 같고, 그 다음 문자열들(idc, astore, aload, invokevirtual, invokestatic, invokespecial 등)은 JVM 명령어라고 합니다.
ASM, BECL, Javassist 이 세 가지가 대표적인 바이트 코드 조작 라이브러리 인데, CGLIB은 이 중에서 ASM을 사용하고, AspectJ는 BECL을 사용 한다네요.
음.. 기본은 항상 다져야 되나 봅니다. 모르는 것도 많고 예전에 본것도 다 까먹네요.
스펙이랑 자바퍼즐러라도 볼까봐요.