目录

开局一张图

动态链接(或指向运行时常量池的方法引用)

为什么需要常量池呢?

早期绑定晚期绑定

静态链接

动态链接

虚方法与非虚方法

非虚方法

虚拟机中提供了以下几条方法调用指令

关于invokedynamic指令

动态类型语言和静态类型语言


开局一张图

动态链接(或指向运行时常量池的方法引用)

每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前的方法的代码能够实现动态链接(Dynamic Linking)。比如:invokedynamic指令。

在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里(#xx,如下图)。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。

为什么需要常量池呢?

常量池的作用,就是为了提供一些符号和常量, 便于指令的识别。

早期绑定晚期绑定

在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。

静态链接

当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变。这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接。

动态链接

如果被调用的方法在编译期无法被确定下来,也就是说,只能在程序运行期将调用方法的符号引用转换为直接引用,由于这种引用转换过程具备动态性,因此也就被称之为动态链接。

对应的方法的绑定机制为:早期绑定(Early Binding)和晚期绑定(Late Binding)。绑定是一个字段、方法或者类在符号引用被替换为直接引用的过程,这仅仅发生一次。

早期绑定:早期绑定就是指被调用的目标方法如果在编译期可知,且运行期保持不变时,即可将这个方法与所属的类型进行绑定,这样一来,由于明确了被调用的目标方法究竟是哪一个,因此也就可以使用静态链接的方式将符号引用转换为直接引用。

晚期绑定:如果被调用的方法在编译期无法被确定下来,只能够在程序运行期根据实际的类型绑定相关的方法,这种绑定方式也就被称之为晚期绑定。

(继承、实现之后,调用父类方法、接口方法(多态),是晚期绑定)

随着高级语言的横空出世,类似于Java一样的基于面向对象的编程语言如今越来越多,尽管这类编程语言在语法风格上存在一定的差别,但是它们彼此之间始终保持着一个共性,那就是都支持封装、继承和多态等面向对象特性,既然这一类的编程语言具备多态性,那么也就具备早期绑定和晚期绑定两种绑定方式。

Java中任何一个普通的方法其实都具备虚函数的特征(具备晚期绑定的特点),它们相当于C++语言中的虚函数(C++中则需要使用关键字virtual来显式定义)。如果在Java程序中不希望某个方法拥有虚函数的特征时,则可以使用关键字final来标记这个方法。

虚方法与非虚方法

非虚方法

如果方法在编译期就确定了具体的调用版本,这个版本在运行时是不可变的。这样的方法称为非虚方法。

静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法。

其他方法称为虚方法。

子类对象的多态性的使用前提:1.类的继承关系2.方法的重写。(多态-虚方法)

虚拟机中提供了以下几条方法调用指令

普通调用指令:

1.invokestatic:调用静态方法,解析阶段确定唯一方法版本。

2.invokespecial:调用<init>方法、私有及父类方法,解析阶段确定唯一方法版本。

3.invokevirtual:调用所有虚方法。

4.invokeinterface:调用接口方法。

动态调用指令:

5.invokedynamic:动态解析出需要调用的方法,然后执行。

前四条指令固化在虚拟机内部,方法的调用执行不可人为干预,而invokedynamic指令则支持由用户确定方法版本。其中invokestatic指令和invokespecial指令调用的方法称为非虚方法,其余的(final修饰的除外)称为虚方法。

关于invokedynamic指令

JVM字节码指令集一直比较稳定,一直到Java7中才增加了一个invokedynamic指令,这是Java为了实现【动态类型语言】支持而做的一种改进。

但是在Java7中并没有提供直接生成invokedynamic指令的方法,需要借助ASM这种底层字节码工具来产生invokedynamic指令。直到java8的Lambda表达式的出现,invokedynamic指令的生成,在java中才有了直接的生成方式。

java7中增加的动态语言类型支持的本质是对java虚拟机规范的修改,而不是对java语言规则的修改,这一块相对来讲比较复杂,增加了虚拟机中的方法调用,最直接的受益者就是运行在java平台的动态语言的编译器。

动态类型语言和静态类型语言

动态类型语言和静态类型语言两者的区别就在于对类型的检查是否在编译期还是在运行期,满足前者就是静态类型语言,反之是动态类型语言。

说的再直白一点就是,静态类型语言是判断变量自身的类型信息;动态类型语言是判断变量值的类型信息,变量没有类型信息,变量值才有类型信息,这是动态语言的一个重要特征。

js:var name='jack';动态语言

python: info = 130;动态语言

只知道java有反射可以说是动态语言,动态链接,早期晚期绑定、虚方法这些概念你知道吗相关推荐

  1. 为什么php动态语言,动态语言静态化

    [TOC] ## 什么是动态语言静态化 将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程. 对实时性要求不高的页面 ## 为什么要静态化 动态脚本 ...

  2. 论java之反射机制,访问类中私有变量,调用私有方法

    我对于发射机制的了解就是它非常流氓,不顾成员变量或成员方法前的保护机制是什么,都可以访问.非常霸道! 这也告诉我们开发中须谨慎使用,否则后果严重.什么访问权限都形同虚设了 先是一个类文件 //f.ja ...

  3. Java的反射机制 及 操作Class类

    反射 一.静态语言和动态语言 1.1 静态语言 静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,运行时结构不可变. 例如:C.C++.Java.De ...

  4. Java基础—反射—简单介绍

    一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的 JavaScript 就是动态语言,除此之外 Ruby,Python 等也属于 ...

  5. java的反射机制的好处

    java中反射是在运行中动态的加载进入.有个很大的好处就是可以节省很多资源.为什么这么说呢,首先我们来说一下jvm,jvm是java的虚拟机,java之所以支持跨平台就是因为java虚拟机的存在.程序 ...

  6. java的反射和反编译机制介绍

    <JAVA啃骨头>之 Java SE 章节 java的反射和反编译机制介绍 一 .什么是java反射机制 JAVA反射机制是指在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和 ...

  7. Java编程:Java的反射机制中的 getComponentType() 方法

    转载自  Java编程:Java的反射机制中的 getComponentType() 方法 Java 中所有的类都继承自 Object,数组本身也是一个 Class,如果我们能够得到数据的 Class ...

  8. 动态语言、静态语言、脚本语言、解释型语言、编译型语言

    本人是php程序员,也做过一年java的开发,学习过c语言,会JavaScript,再回想起来,感觉语言之间的区别有点迷惑,所以整理一下. 1.动态语言 动态语言是在运行时才确定数据类型的语言.变量使 ...

  9. 【编程语言】静态语言与动态语言的本质区别以及其应用场景

    从宏观的语言层面来说,编程语言类型共分为两大类:静态语言(又叫强类型语言)与动态语言(又叫弱类型语言).静态语言通常是低级(底层)语言,动态语言一般为高级(应用)语言,静态语言运用通常是通过编译器,而 ...

最新文章

  1. linux七个运行级如何设置,RHEL7 运行级别简介及切换操作
  2. Leetcode--5081. 步进数
  3. SOAP协议初级指南(9)
  4. PAT乙级(1015 德才论)
  5. mysql导入报错1071_导入sql文件报错:1071 Specified key was too long; max key length is 767 bytes...
  6. java redis 哨兵_突破Java面试(23-7) - Redis的哨兵架构
  7. 你真的会调试 Linux 内核故障吗,看完这一篇后你会茅塞顿开的!
  8. linux拆分文件会影响源文件吗,linux split拆分文件
  9. Hadoop3.0.3-SYNTH运行
  10. Uchome分页方法
  11. java设置excel表头_设置Java导出Excel表头
  12. 阿里云实践 - HTML5断点播放m3u8视频(videojs)
  13. ubuntu 20.04网卡驱动安装(rtl8812au)
  14. ubuntu桌面美化mac_教程:为你的linux桌面带来Mac OS Mojave的体验
  15. 智慧工厂是什么 智慧工厂方案举例 智慧工厂案例
  16. http协议及httpd配置
  17. android 应用克隆 详细信息,IT之家学院:如何将一台安卓手机中的应用“克隆”到另一台...
  18. [AT ZONe2021]Sneaking
  19. 10个提升PPT幻灯片制作效率的方法
  20. 九月开始复习计算机考研,2019计算机考研复习不要盲目开始

热门文章

  1. 二进制查找替换常用函数
  2. android webview tel:,Android WebView“tel:”链接显示未找到网页
  3. c++ 截取\r\n问题
  4. shell+中sum的用法_shell高级用法
  5. shell获取多张网卡对应的ip_网络是怎样连接的 -- IP与以太网的收发操作
  6. matlab fft函数说明_【V2.0更新】基于FFT算法的MTALAB傅里叶级数3D可视化
  7. java 图像处理 空白_使用Java进行图像处理的一些基础操作
  8. saiav.win forum.php,【emWin实战教程V2.0】第4章    emWin5.xx的裸机方式移植(F4
  9. AutoML - 数据增广
  10. 协方差与相关系数的再理解