1回复
2年前
private函数调用,jdk8和jdk13生成的指令不同。
这段简单的代码:
public class Test {
private void testPrivate() {}
public void testPublic() {}
public static void main(String[] args) {
Test t = new Test();
t.testPrivate();
t.testPublic();
}
}
java8生成字节码
0 new #2 <Test>
3 dup
4 invokespecial #3 <Test.<init>>
7 astore_1
8 aload_1
9 invokespecial #4 <Test.testPrivate>
12 aload_1
13 invokevirtual #5 <Test.testPublic>
16 return
java13生成字节码
0 new #7 <Test>
3 dup
4 invokespecial #9 <Test.<init>>
7 astore_1
8 aload_1
9 invokevirtual #10 <Test.testPrivate>
12 aload_1
13 invokevirtual #13 <Test.testPublic>
16 return
可以看到对private函数调用,java8生成了 invokespecial, 而java13生成了invokevirtual,为什么会这样?
3356 阅读
这个其实不是JDK13才有的,JDK11里提供的一个变化
可以加一个javac的参数你会看到不一样的效果,比如javac -XDdisableVirtualizedPrivateInvoke XXXXX.java
可以看看这个描述 https://bugs.openjdk.java.net/browse/JDK-8046171