我一直试图弄清楚 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
编译后被替换为它的值(内联优化)。所以,我希望在用它的包装器替换原始类型后看到类似的东西,但是......
第二种情况:非原始类型编译时优化
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 编译和优化的东西?
升级版:
内容Class$1
:
class Clazz$1 extends Clazz {
Clazz$1(Integer paramInteger) {}
void foo() {
System.out.println(this.val$i);
}
}