ãã®èšäºã§ã¯ããã®ãããã¯ãããã«æãäžããäžã§æ§ç¯ã§ããéåžžã«åºæ¬çãªããšã説æããŸãïŒçŽPerãïŒã
ç°¡åãªäŸããå§ããŸããããã€ãŸãã1ã€ã®ãã£ãŒã«ããšãã®ã²ãã¿ãŒãšã»ãã¿ãŒãæã€POJOã§ãã
public class Foo { private String bar; public String getBar(){ return bar; } public void setBar(String bar) { this.bar = bar; } }
javac Foo.javaã³ãã³ãã䜿çšããŠã¯ã©ã¹ãã³ã³ãã€ã«ãããšããã€ãã³ãŒããå«ãFoo.classãã¡ã€ã«ã衚瀺ãããŸãã HEXãšãã£ã¿ãŒã§ã®ã³ã³ãã³ãã®å€èŠ³ã¯æ¬¡ã®ãšããã§ãã

16é²æ°ïŒãã€ãïŒã®åãã¢ã¯ããªãã³ãŒãïŒããŒã¢ããã¯ïŒã«å€æãããŸãã ããããã€ããªåœ¢åŒã§èªã¿åãããšããã®ã¯æ®é ·ã§ãã ããŒã¢ããã¯è¡šçŸã«ç§»ããŸãããã
javap -c Fooã³ãã³ãã¯ãã€ãã³ãŒããåºåããŸãã
public class Foo extends java.lang.Object { public Foo(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public java.lang.String getBar(); Code: 0: aload_0 1: getfield #2; //Field bar:Ljava/lang/String; 4: areturn public void setBar(java.lang.String); Code: 0: aload_0 1: aload_1 2: putfield #2; //Field bar:Ljava/lang/String; 5: return }
ã¯ã©ã¹ã¯éåžžã«åçŽãªã®ã§ããœãŒã¹ã³ãŒããšçæããããã€ãã³ãŒãã®é¢ä¿ãç°¡åã«ç¢ºèªã§ããŸãã ãŸããã¯ã©ã¹ã®ãã€ãã³ãŒãããŒãžã§ã³ã§ã¯ãã³ã³ãã€ã©ãŒãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒJVMä»æ§ã§èšè¿°ãããŠããïŒãåŒã³åºããŠããããšãããããŸãã
ããã«ããã€ãã³ãŒãåœä»€ïŒaload_0ãšaload_1ããããŸãïŒã調ã¹ããšããããã®äžéšã«ã¯aload_0ãistore_2ã®ãããªãã¬ãã£ãã¯ã¹ãããããšãããããŸãã ããã¯ãåœä»€ãåäœããããŒã¿ã®ã¿ã€ããæããŸãã æ¥é èŸãaãã¯ããªãã³ãŒãããªããžã§ã¯ããžã®åç §ãå¶åŸ¡ããããšãæå³ããŸãã ãIãã¯ããããæŽæ°ãå¶åŸ¡ããŸãã
ããã§èå³æ·±ãç¹ã¯ãäžéšã®åœä»€ãå®éã«ã¯ã©ã¹å®æ°ã®ããŒã«ãåç §ããã¿ã€ãïŒ1ããã³ïŒ2ã®å¥åŠãªãªãã©ã³ãã§åäœããããšã§ãã ã¯ã©ã¹ãã¡ã€ã«ã詳ããèŠãŠã¿ãŸãããã javap -c -s -verboseïŒ-sã¯çœ²åã衚瀺ãã-verboseã¯è©³çŽ°ãªåºåã衚瀺ïŒãå®è¡ããŸã
Compiled from "Foo.java" public class Foo extends java.lang.Object SourceFile: "Foo.java" minor version: 0 major version: 50 Constant pool: const #1 = Method #4.#17; // java/lang/Object."":()V const #2 = Field #3.#18; // Foo.bar:Ljava/lang/String; const #3 = class #19; // Foo const #4 = class #20; // java/lang/Object const #5 = Asciz bar; const #6 = Asciz Ljava/lang/String;; const #7 = Asciz ; const #8 = Asciz ()V; const #9 = Asciz Code; const #10 = Asciz LineNumberTable; const #11 = Asciz getBar; const #12 = Asciz ()Ljava/lang/String;; const #13 = Asciz setBar; const #14 = Asciz (Ljava/lang/String;)V; const #15 = Asciz SourceFile; const #16 = Asciz Foo.java; const #17 = NameAndType #7:#8;// "":()V const #18 = NameAndType #5:#6;// bar:Ljava/lang/String; const #19 = Asciz Foo; const #20 = Asciz java/lang/Object; { public Foo(); Signature: ()V Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return LineNumberTable: line 1: 0 public java.lang.String getBar(); Signature: ()Ljava/lang/String; Code: Stack=1, Locals=1, Args_size=1 0: aload_0 1: getfield #2; //Field bar:Ljava/lang/String; 4: areturn LineNumberTable: line 5: 0 public void setBar(java.lang.String); Signature: (Ljava/lang/String;)V Code: Stack=2, Locals=2, Args_size=2 0: aload_0 1: aload_1 2: putfield #2; //Field bar:Ljava/lang/String; 5: return LineNumberTable: line 8: 0 line 9: 5 }
ããã§ãããããã©ã®ãããªå¥åŠãªãªãã©ã³ãã§ããããããããŸãã ããšãã°ãïŒ2ïŒ
constïŒ2 =ãã£ãŒã«ãïŒ3ãïŒ18; // Foo.bar:Ljava/lang/String;
以äžãåç §ããŸãïŒ
constïŒ3 =ã¯ã©ã¹ïŒ19; // foo
constïŒ18 = NameAndTypeïŒ5ïŒïŒ6; // barïŒLjava / lang / String;
ãªã©ãªã©ã
åãªãã¬ãŒã·ã§ã³ã³ãŒãã«ã¯çªå·ïŒ0ïŒaload_0ïŒã®ã©ãã«ãä»ããŠããããšã«æ³šæããŠãã ããã ããã¯ããã¬ãŒã å ã®åœä»€ã®äœçœ®ã瀺ããŠããŸãããããäœãæå³ããã®ããããã«èª¬æããŸãã
ãã€ãã³ãŒãã®ä»çµã¿ãç解ããã«ã¯ãå®è¡ã¢ãã«ãèŠãŠãã ããã JVMã¯ãã¹ã¿ãã¯ããŒã¹ã®å®è¡ã¢ãã«ã䜿çšããŸãã åã¹ã¬ããã«ã¯ããã¬ãŒã ãå«ãJVMã¹ã¿ãã¯ããããŸãã ããšãã°ããããã¬ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšã次ã®ãã¬ãŒã ã衚瀺ãããŸãã

ã¡ãœãããåŒã³åºããããã³ã«ãæ°ãããã¬ãŒã ãäœæãããŸãã ãã¬ãŒã ã¯ããªãã©ã³ãã¹ã¿ãã¯ãããŒã«ã«å€æ°ã®é åãããã³å®è¡ãããã¡ãœããã®ã¯ã©ã¹ã®å®æ°ã®ããŒã«ãžã®ãªã³ã¯ã§æ§æãããŸãã

ããŒã«ã«å€æ°ã®é åã®ãµã€ãºã¯ãããŒã«ã«å€æ°ãšã¡ãœããã®ãã©ã¡ãŒã¿ãŒã®æ°ãšãµã€ãºã«å¿ããŠãã³ã³ãã€ã«æã«æ±ºå®ãããŸãã ãªãã©ã³ãã®ã¹ã¿ãã¯-ã¹ã¿ãã¯å ã®å€ãæžã蟌ã¿ããã³åé€ããããã®LIFOã¹ã¿ãã¯ã ãµã€ãºãã³ã³ãã€ã«æã«æ±ºå®ãããŸãã ããã€ãã®ãªãã³ãŒãã¯ã¹ã¿ãã¯ã«å€ãè¿œå ããä»ã®ãªãã³ãŒãã¯ã¹ã¿ãã¯ãããªãã©ã³ããååŸãããã®ç¶æ ãå€æŽããŠã¹ã¿ãã¯ã«è¿ããŸãã ãªãã©ã³ãã¹ã¿ãã¯ã¯ãïŒæ»ãå€ïŒã¡ãœããã«ãã£ãŠè¿ãããå€ãååŸããããã«ã䜿çšãããŸãã
public String getBar(){ return bar; } public java.lang.String getBar(); Code: 0: aload_0 1: getfield #2; //Field bar:Ljava/lang/String; 4: areturn
ãã®ã¡ãœããã®ãã€ãã³ãŒãã¯3ã€ã®ãªãã³ãŒãã§æ§æãããŠããŸãã æåã®ãªãã³ãŒãaload_0ã¯ãããŒã«ã«å€æ°ããŒãã«ããã€ã³ããã¯ã¹0ã®å€ãã¹ã¿ãã¯ã«ããã·ã¥ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãšã€ã³ã¹ã¿ã³ã¹ã¡ãœããã®ããŒã«ã«å€æ°ã®ããŒãã«ã«ããthisåç §ã«ã¯ãåžžã«0ã®ã€ã³ããã¯ã¹ããããŸãã次ã®ãªãã³ãŒãgetfieldã¯ããªããžã§ã¯ããã£ãŒã«ããååŸããŸãã æåŸã®ã¹ããŒãã¡ã³ãareturnã¯ãã¡ãœããããåç §ãè¿ããŸãã
åã¡ãœããã«ã¯ã察å¿ãããã€ãã³ãŒãé åããããŸãã 16é²ãšãã£ã¿ã§.classãã¡ã€ã«ã®å 容ãèŠããšããã€ãã³ãŒãé åã«æ¬¡ã®å€ã衚瀺ãããŸãã

ãããã£ãŠãgetBarã¡ãœããã®ãã€ãã³ãŒãã¯2A B4 00 02 B0ã§ãã 2Aã¯aload_0ãæããB0ã¯æ»ããæããŸãã ã¡ãœããã®ãã€ãã³ãŒãã«3ã€ã®åœä»€ãããããã€ãé åã«5ã€ã®èŠçŽ ãããã®ã¯å¥åŠã«æãããããããŸããã ããã¯ãgetfieldïŒB4ïŒã2ã€ã®ãã©ã¡ãŒã¿ãŒïŒ00 02ïŒãå¿ èŠãšããé åã®äœçœ®2ãš3ãå æãããããé åã®5ã€ã®èŠçŽ ãå æããããã§ãã æ»ãåœä»€ã¯4æ¡ã·ãããããŸãã
ããŒã«ã«å€æ°ããŒãã«
ããŒã«ã«å€æ°ã§äœãèµ·ãããã説æããããã«ãå¥ã®äŸã䜿çšããŸãã
public class Example { public int plus(int a){ int b = 1; return a + b; } }
ããã«ã¯2ã€ã®ããŒã«ã«å€æ°ããããŸã-ã¡ãœãããã©ã¡ãŒã¿ãŒãšããŒã«ã«å€æ°int bã ãã€ãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
public int plus(int); Code: Stack=2, Locals=3, Args_size=2 0: iconst_1 1: istore_2 2: iload_1 3: iload_2 4: iadd 5: ireturn LineNumberTable: line 5: 0 line 6: 2
LocalVariableTableïŒ
éå§ã®é·ãã®ã¹ãããåã®çœ²å
0 6 0ãã®LExample;
0 6 1 a I
2 4 2 b I
ãã®ã¡ãœããã¯ãiconst_1ã§å®æ°1ãããŒãããistore_2ã§ããŒã«ã«å€æ°2ã«å ¥ããŸãã çŸåšãããŒã«ã«å€æ°ããŒãã«ã§ã¯ãã¹ããã2ãäºæ³ã©ããå€æ°bã§å æãããŠããŸãã 次ã«ãiload_1ã¯å€ãã¹ã¿ãã¯ã«ããŒãããiload_2ã¯bã®å€ãããŒãããŸãã iaddã¯ãã¹ã¿ãã¯ãã2ã€ã®ãªãã©ã³ãããããããããããè¿œå ããŠãã¡ãœããã®å€ãè¿ããŸãã
äŸå€åŠç
try-catch-finallyã³ã³ã¹ãã©ã¯ããªã©ã®äŸå€åŠçã®å Žåã«ãã€ãã³ãŒããååŸããæ¹æ³ã®èå³æ·±ãäŸã
public class ExceptionExample { public void foo(){ try { tryMethod(); } catch (Exception e) { catchMethod(); }finally{ finallyMethod(); } } private void tryMethod() throws Exception{} private void catchMethod() {} private void finallyMethod(){} }
fooïŒïŒã¡ãœããã®ãã€ãã³ãŒãïŒ
public void foo(); Code: 0: aload_0 1: invokespecial #2; //Method tryMethod:()V 4: aload_0 5: invokespecial #3; //Method finallyMethod:()V 8: goto 30 11: astore_1 12: aload_0 13: invokespecial #5; //Method catchMethod:()V 16: aload_0 17: invokespecial #3; //Method finallyMethod:()V 20: goto 30 23: astore_2 24: aload_0 25: invokespecial #3; //Method finallyMethod:()V 28: aload_2 29: athrow 30: return Exception table: from to target type 0 4 11 Class java/lang/Exception 0 4 23 any 11 16 23 any 23 24 23 any
ã³ã³ãã€ã©ãŒã¯ãtry-catch-finallyå ã§å¯èœãªãã¹ãŠã®ã¹ã¯ãªããã®ã³ãŒããçæããŸããfinallyMethodïŒïŒãããã¯ã¯3ååŒã³åºãããŸãïŒïŒïŒã tryãããã¯ã¯ãtryãååšããªãããã«ã³ã³ãã€ã«ãããæçµçã«ããŒãžãããŸããïŒ
0ïŒaload_0
1ïŒinvokespecialïŒ2; //ã¡ãœããtryMethod :(ïŒV
4ïŒaload_0
5ïŒç¹å¥ãªïŒ3ãåŒã³åºããŸãã //ã¡ãœããfinallyMethod :(ïŒV
ãããã¯ãå®è¡ããããšãgotoåœä»€ã¯returnãªãã³ãŒãã§30çªç®ã®äœçœ®ã«å®è¡ãã¹ããŒããŸãã
tryMethodãäŸå€ãã¹ããŒããå ŽåãäŸå€ããŒãã«ããæåã®é©åãªïŒå éšïŒäŸå€ãã³ãã©ãŒãéžæãããŸãã äŸå€ã®è¡šãããäŸå€ãã£ããã®äœçœ®ã¯11ã§ããããšãããããŸãã
0 4 11ã¯ã©ã¹java / lang /äŸå€
ããã«ãããcatchMethodïŒïŒããã³finallyMethodïŒïŒã«å®è¡ãã¹ããŒãããŸãã
11ïŒastore_1
12ïŒaload_0
13ïŒinvokespecialïŒ5; // catchMethodã¡ãœãã:(ïŒV
16ïŒaload_0
17ïŒinvokespecialïŒ3; // finallyMethodã¡ãœãã:(ïŒV
å®è¡äžã«å¥ã®äŸå€ãã¹ããŒãããå ŽåãäŸå€ããŒãã«ã®äœçœ®ã¯23ã«ãªããŸãã
0 4 23ä»»æ
11 16 23ä»»æ
23 24 23ä»»æ
23ããå§ãŸãæé ïŒ
23ïŒastore_2
24ïŒaload_0
25ïŒinvokespecialïŒ3; //ã¡ãœããfinallyMethod :(ïŒV
28ïŒaload_2
29ïŒæãã
30ïŒæ»ã
ãã®ãããfinallyMethodïŒïŒã¯aload_2ãšathrowã§æªåŠçã®äŸå€ãã¹ããŒããŠå®è¡ãããŸãã
ãããã«
ãããã¯ãJVMãã€ãã³ãŒãé åããã®ã»ãã®ããããªãã€ã³ãã§ãã ã»ãšãã©ã¯ãdeveloperWorks Peter Haggarã®èšäºJavaãã€ãã³ãŒãããã®ãã®ã§ããããã€ãã³ãŒããç解ããããšã¯ãããè¯ãããã°ã©ããŒã«ãªããŸãã ãã®èšäºã¯å°ãæ代é ãã§ãããããã§ãé¢é£æ§ããããŸãã BCELãŠãŒã¶ãŒã¬ã€ãã«ã¯ããã€ãã³ãŒãã®åºæ¬ã«ã€ããŠã®é©åãªèª¬æãå«ãŸããŠããã®ã§ãèå³ã®ãã人ã«ã¯èªãã§ããããšããå§ãããŸãã ããã«ãä»®æ³ãã·ã³ã®ä»æ§ãæçšãªæ å ±æºã«ãªããŸãããç解ããã®ã«åœ¹ç«ã€ã°ã©ãã£ãã¯çŽ æããªããããèªã¿ããããããŸããã
äžè¬ã«ããã€ãã³ãŒãã®ä»çµã¿ãç解ããããšã¯ãç¹ã«ãã¬ãŒã ã¯ãŒã¯ãJVMèšèªã³ã³ãã€ã©ããŸãã¯ãã®ä»ã®ãŠãŒãã£ãªãã£ãæ€èšããŠãã人ã«ãšã£ãŠãJavaããã°ã©ãã³ã°ã®ç¥èãæ·±ããäžã§éèŠãªãã€ã³ãã ãšæããŸãã