为什么javac会插入Objectes.requireNonNull(this)作为最终字段?
请考虑以下类:
class Temp {
private final int field = 5;
int sum() {
return 1 + this.field;
}
}
然后我编译并反编译该类:
> javac --version
javac 11.0.5
> javac Temp.java
> javap -v Temp.class
...
int sum();
descriptor: ()I
flags: (0x0000)
Code:
stack=2, locals=1, args_size=1
0: iconst_1
1: aload_0
2: invokestatic #3 // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
5: pop
6: iconst_5
7: iadd
8: ireturn
简单来说,编译成这样:javac
sum()
int sum() {
final int n = 1;
Objects.requireNonNull(this); // <---
return n + 5;
}
这是在做什么?有什么意义?这是否以某种方式与可访问性有关?Objects.requireNonNull(this)
Java 8编译器也类似。它插入而不是:this.getClass()
Objects.requireNonNull(this)
int sum() {
final int n = 1;
this.getClass(); // <---
return n + 5;
}
我也尝试用Eclipse编译它。它不会插入 :requireNonNull
int sum() {
return 1 + 5;
}
所以这是javac特定的行为。