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을 사용 한다네요.

음.. 기본은 항상 다져야 되나 봅니다. 모르는 것도 많고 예전에 본것도 다 까먹네요.
스펙이랑 자바퍼즐러라도 볼까봐요.