我总是习惯于检查null
if(null==obj)
Run Code Online (Sandbox Code Playgroud)
当我编译我的代码并在反编译后查看.class文件时,我可以看到我的代码被更改为
if(obj==null)
Run Code Online (Sandbox Code Playgroud)
我知道在java中null==obj并obj==null没有关系.但我很想知道为什么编译器会改变它?
编译器没有改变任何东西.它忠实地编译if (null == obj)并if (obj == null)转换成不同的字节码,反编译器转换回相同的Java代码.
与null右边比较,即
if (o == null) {
...
}
Run Code Online (Sandbox Code Playgroud)
通过ifnonnull指令转换为此字节代码:
0: aload_0
1: ifnonnull ...
Run Code Online (Sandbox Code Playgroud)
与null左边比较,即
if (null == o) {
...
}
Run Code Online (Sandbox Code Playgroud)
通过if_acmpne指令转换为不同的字节码:
0: aconst_null
1: aload_0
2: if_acmpne ...
Run Code Online (Sandbox Code Playgroud)
理论上,反编译器有足够的信息来确定参数在源文件中的排序方式.但是,他们为两个订单生成了相同的代码.
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |