作者似乎指的是捕獲的變量被翻譯成本地/匿名類的字段的事實。
如果disasemble LocalClass
你可以看到這個(其中Main
是封閉類的名稱):
class Main$1LocalClass {
final int val$y;
final Main this$0;
Main$1LocalClass();
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LMain;
5: aload_0
6: iload_2
7: putfield #2 // Field val$y:I
10: aload_0
11: invokespecial #3 // Method java/lang/Object."<init>":()V
14: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
17: aload_0
18: getfield #2 // Field val$y:I
21: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
24: return
}
第一個字段是局部變量y
,和第二場是封閉的參考實例。此外,這些值隱式傳遞給本地類的構造函數。
本質LocalClass
看起來是這樣的:
class LocalClass {
final int val$y;
final Main this$0;
LocalClass(Main arg1, int arg2) {
this.this$0 = arg1; // bytecode 1-2
this.val$y = arg2; // bytecode 5-7
super(); // bytecode 10-11
System.out.println(this.val$y); // bytecode 14-21
}
}
我覺得你過於複雜的事情。此外,絕大多數在方法中聲明的類都是匿名類,它們可以用於非常特定和狹義的目的。 – efekctive
必須將* value *在運行時複製到內部類的每個* instance *中。複製和存儲變量的代碼可以在編譯時創建。 –