Java五⼤invoke指令fn键
java⾥的五⼤invoke指令分别是invokespecial、invokevirtual、invokestatic、invokeinterface、invokedynamic。
静态⽅法的调⽤,⽣成的是invokestatic指令。
小学语文论文题目
接⼝⽅法的调⽤,⽣成的是invokeinterface指令。
其他的⽅法,区别在于⾮final的⽅法⽣成invokevirtual指令,final⽅法则⽣成invokespecial指令,这是java保证多态的关键。私有⽅法都是final⽅法。 特殊的地⽅还有super关键字⽅法调⽤,⽣成invokespecial指令。
最复杂的当属于invokedynamic指令了,其⽬的是实现动态类型。众所周知,java是⼀种静态类型语⾔。举个例⼦,python可以这样写代码:
带有春的成语
lass A:
def print(lf):
print('A')贱货母狗
class B:
北京新光天地def print(lf):
print('B')
在爱的世界里def f(x):
怎么往u盘下载歌曲x.print()
if __name__ =='__main__':
# 取命令⾏参数
f(A())
情感口述实录
f(B())
如果换成java,这两个类就必须实现同⼀个接⼝。但是现在java也可以了,JDK7引⼊的invokedynamic指令就可以实现这种动态类型,但是JDK7的java语法并不⽀持,只有JVM上动态语⾔⽐如closure、kotlin、Scala等语⾔提供了⽀持。但是到了JDK8,lambda表达式的出现使得java编译
器可以⽣成invokedynamic指令。这个指令底层依靠methodhandle来实现,其实现原理超级复杂。但简⽽⾔之,就是把callsite传给invokedynamic指令,从call site中找到bootstrap method来调⽤真正的⽅法。