w Πϯελϯεϝιου w JOWPLFJOUFSGBDF w ΠϯλʔϑΣʔεܦ༝ͷϝιου JOWPLFEZOBNJDͷରJOWPLFTUBUJD͡Όͳ͍ w *OWPLFEZOBNJD w ϚδͰ%ZOBNJDʢʁʣ ͷ࣮ߦ Ͳ͏Β͜Μͳ͔Μ͡ JOWPLFTUBUJD͋Δ͕ɺ JOWPLFEZOBNJDͷରͰͳ͔ͬͨ
w Πϯελϯεϝιου w JOWPLFJOUFSGBDF w ΠϯλʔϑΣʔεܦ༝ͷϝιου ʢ࠶ܝʣ͜Μͳ͔Μ͡ w *OWPLFEZOBNJD w ϚδͰ%ZOBNJDʢʁʣ ͷ࣮ߦ *OWPLFEZOBNJD͕ͲΕ΄Ͳ%ZOBNJD͔ΛΔͨΊʹɺ *OWPLFTUBUJD͕ͲͷΑ͏ʹϝιουΛ࣮ߦ͢Δ͔Λ؆୯ʹݟ͍ͯ͜͏
w Πϯελϯεϝιου w JOWPLFJOUFSGBDF w ΠϯλʔϑΣʔεܦ༝ͷϝιου JOWPLFTUBUJD%ZOBNJDͳ*OWPLF w *OWPLFEZOBNJD w ϚδͰ%ZOBNJDʢʁʣ $1͔ΒϝιουΛ ಈతʹݕࡧղܾ ࣮ͯ͠ߦ ϝιου࣮ߦ࣌ʹಈతʹղܾ͞ΕΔ͕ɺ ͦͷݕࡧରFYUFOET JNQMFNFOUT+BWBͷݴޠ༷ʹڧ͘ґଘ͢Δ Ͳ͏Β͜Μͳ͔Μ͡
w Πϯελϯεϝιου w JOWPLFJOUFSGBDF w ΠϯλʔϑΣʔεܦ༝ͷϝιου ʢ࠶ܝʣ͜Μͳ͔Μ͡ w *OWPLFEZOBNJD w ϚδͰ%ZOBNJDʢʁʣ ͰJOWPLFEZOBNJDɺͲΕ΄Ͳ%ZOBNJDͳͷ͔ʁ ࣮ߦରΛ +BWBͷݴޠ༷ʹै͍ +7.Ͱݕࡧ࣮ͯ͠ߦ
w Πϯελϯεϝιου w JOWPLFJOUFSGBDF w ΠϯλʔϑΣʔεܦ༝ͷϝιου *OWPLF%ZOBNJDϚδͰ%ZOBNJD w *OWPLFEZOBNJD w ॳճ࣮ߦ࣌ʹ #PPUTUSBQ.FUIPEͰࢦఆ͞ ΕͨϝιουΛ࣮ߦ͠ɺ࣮ߦର Λͦͷ݁ՌͰܾΊΔ ࣮ߦରΛ +BWBͷݴޠ༷ʹै͍ +7.Ͱݕࡧ࣮ͯ͠ߦ ͭ·Γ͜͏͍͏͜ͱ
w Πϯελϯεϝιου w JOWPLFJOUFSGBDF w ΠϯλʔϑΣʔεܦ༝ͷϝιου *OWPLF%ZOBNJDϚδͰ%ZOBNJD w *OWPLFEZOBNJD w ॳճ࣮ߦ࣌ʹ #PPUTUSBQ.FUIPEͰࢦఆ͞ ΕͨϝιουΛ࣮ߦ͠ɺ࣮ߦର Λͦͷ݁ՌͰܾΊΔ ίϯύΠϥ͕#4.Λు͖͑͢͞ΕԿͰ͋Γ ࣮ߦ࣌ʹ+7.ʹଘࡏ͠ͳ͍ϝιου͢Βղܾɾ࣮ߦͰ͖Δਆͷ͖ྗ ࣮ࡍʹ-BNCEBͰɺ࣮ߦΫϥε͕#4.ʹΑΓ࿉͞ΕΔ ͭ·Γ͜͏͍͏͜ͱ ࣮ߦରΛ +BWBͷݴޠ༷ʹै͍ +7.Ͱݕࡧ࣮ͯ͠ߦ
main(String[] args) { Runnable r = () -> System.out.println("Hello"); r.run(); } } public class invoke.dynamic.InvokeDynamicSimple Constant Pool: #2 = InvokeDynamic #0:#23 // #0:run:()Ljava/lang/Runnable; #23 = NameAndType #35:#36 // run:()Ljava/lang/Runnable; : { public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=2, args_size=1 0: invokedynamic #2, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable; *OWPLF%ZOBNJD4JNQMFKBWB invokedynamic Operation Invoke a dynamically-computed call site Format invokedynamic indexbyte1 indexbyte2 0 0 Forms invokedynamic = 186 (0xba) Description First, the unsigned indexbyte1 and indexbyte2 are used to construct an index into the run-time constant pool of the current class (§2.6), The values of the third and fourth operand bytes must always be zero. JOWPLFEZOBNJD YCB *OWPLF%ZOBNJD4JNQMFDMBTT *OWPLF%ZOBNJD4JNQMFKWN
main(String[] args) { Runnable r = () -> System.out.println("Hello"); r.run(); } } public class invoke.dynamic.InvokeDynamicSimple Constant Pool: #2 = InvokeDynamic #0:#23 // #0:run:()Ljava/lang/Runnable; #23 = NameAndType #35:#36 // run:()Ljava/lang/Runnable; : { public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=2, args_size=1 0: invokedynamic #2, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable; *OWPLF%ZOBNJD4JNQMFKBWB invokedynamic Operation Invoke a dynamically-computed call site Format invokedynamic indexbyte1 indexbyte2 0 0 Forms invokedynamic = 186 (0xba) Description First, the unsigned indexbyte1 and indexbyte2 are used to construct an index into the run-time constant pool of the current class (§2.6), The values of the third and fourth operand bytes must always be zero. JOWPLFEZOBNJD YCB *OWPLF%ZOBNJD4JNQMFDMBTT *OWPLF%ZOBNJD4JNQMFKWN ͨͬͨ#ZUFͰ͜Ε͕දݱ͞Ε͍ͯΔͳΜͯ ඒ͍͠ ͦ͏ࢥΘΜ͔Ͷʁ