Рассмотрим следующий класс:
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.
this
по сравнению с другими выражениями. - person Holger   schedule 12.06.2020javac 15-ea
. дальнейшее наблюдение, удалениеfinal
работает нормально. - person Naman   schedule 12.06.2020int sum();... Code: stack=2, locals=1, args_size=1 0: iconst_1 1: aload_0 2: invokestatic #13 // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; 5: pop 6: iconst_5 7: iadd 8: ireturn
по сравнению с удалением окончательного ключевого слова, разрешающегося вint sum();... Code: stack=2, locals=1, args_size=1 0: iconst_1 1: aload_0 2: getfield #7 // Field field:I 5: iadd 6: ireturn
- person Naman   schedule 12.06.2020