相关疑难解决方法(0)

在Java Lambda中,为什么getClass()在捕获的变量上调用

如果你看一下字节码

Consumer<String> println = System.out::println;
Run Code Online (Sandbox Code Playgroud)

Java 8更新121生成的字节代码是

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
DUP
INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
POP
INVOKEDYNAMIC accept(Ljava/io/PrintStream;)Ljava/util/function/Consumer; [
  // handle kind 0x6 : INVOKESTATIC
  java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
  // arguments:
  (Ljava/lang/Object;)V, 
  // handle kind 0x5 : INVOKEVIRTUAL
  java/io/PrintStream.println(Ljava/lang/String;)V, 
  (Ljava/lang/String;)V
]
ASTORE 1
Run Code Online (Sandbox Code Playgroud)

getClass()正在调用该方法System.out,结果被忽略.

这是间接空引用检查吗?

当然,如果你跑

PrintStream out = null;
Consumer<String> println = out::println;
Run Code Online (Sandbox Code Playgroud)

这会触发NullPointerException.

java lambda bytecode javac java-8

34
推荐指数
1
解决办法
964
查看次数

为什么字节码在直接访问字段时调用 Object-&gt;getClass()

我反编译了 Java(实际上是 Dalvik)字节码。在方法的开头,我直接访问实例成员的字段(即不通过 getter)。

似乎 Java 调用Object.getClass()了访问的实例成员 ( mOther),但没有在任何地方使用结果。这是某种检查吗?为什么需要这个电话?我怀疑这是因为我直接访问了一个字段(在该类中定义),但我没有看到连接。

Java代码和反编译后的字节码如下。

(请注意,最后一条指令lifeTime作为常量加载,0x0001因为 in MyOtherClass,我有lifeTime一个public final字段,并且当前是从代码初始化的。)

MyOtherClass other = mOther;
if (mAge >= other.lifeTime) { // lifeTime is initialized to 0x0001
   end();
   return;
}

.line 53
move-object/from16 v0, p0
iget-object v0, v0, Lcom/example/engine/MyClass1;->mOther:Lcom/example/engine/MyOtherClass;
move-object/from16 v16, v0

.line 54
.local v16, other:Lcom/example/engine/MyOtherClass;
move-object/from16 v0, p0

iget v0, v0, Lcom/example/engine/MyClass1;->mAge:I
move/from16 v18, v0

// Why is Object->getClass() called?
invoke-virtual/range {v16 .. v16}, …
Run Code Online (Sandbox Code Playgroud)

java android bytecode dalvik

3
推荐指数
1
解决办法
498
查看次数

标签 统计

bytecode ×2

java ×2

android ×1

dalvik ×1

java-8 ×1

javac ×1

lambda ×1