私はJavaの最適化についてすべてを理解しようとしていて、何か面白いものを見つけました。
最初のケース:プリミティブ型のコンパイル時の最適化
public class Clazz {
public static void main(String args[]) {
final int i = 300;
new Clazz() {
void foo() {
System.out.println(i);
}
}.foo();
}
}
コンパイル後(私はjd-gui-0.3.5.windows
バイナリファイルを逆コンパイルするために使用しています)、次のようになります。
public class Clazz {
public static void main(String[] args) {
int i = 300;
new Clazz() {
void foo() {
System.out.println(300);
}
}.foo();
}
}
さすが、そうではありませんか?i
コンパイル後にその値(インライン最適化)に置き換えられました。したがって、プリミティブ型をラッパーに置き換えた後、似たようなものが表示されると思いましたが...
2番目のケース:非プリミティブ型のコンパイル時の最適化
public class Clazz {
public static void main(String args[]) {
final Integer i = 300; // replaced int with Integer
new Clazz() {
void foo() {
System.out.println(i);
}
}.foo();
}
}
コンパイル後:
public class Clazz {
public static void main(String[] args) {
Integer i = Integer.valueOf(300);
new Clazz() {
void foo() {
System.out.println(Clazz.this);
}
}.foo();
}
}
質問:
Clazz.this
この文脈では何ですか?のインスタンスを囲むことへの参照であることは知っていますがClazz
、その場合は機能しないはずです!印刷する必要がありますi
が、コンパイラがClazz.this
代わりに印刷するように提案し、機能します。何が問題ですか?正しく逆コンパイルされませjd-gui
んか、それともJavaのコンパイルと最適化について何かが足りませんか?
UPD:
内容Class$1
:
class Clazz$1 extends Clazz {
Clazz$1(Integer paramInteger) {}
void foo() {
System.out.println(this.val$i);
}
}