首页
学习
活动
专区
圈层
工具
发布

Java虚拟机学习:方法调用的字节码指令

我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种: 1. invokespecial:调用私有实例方法; 2. invokestatic...invokedynamic:调用动态方法; 这里我们通过一个实例将这些方法调用的字节码指令逐个列出。...: invokespecial:调用私有实例方法 getValue()方法中调用了私有实例方法add(int a, int b),反编译结果如下所示,注意编号为3的那一行: public java.lang.String...invokespecial指令来实现的; invokestatic:调用静态方法 getValue()方法中,调用了静态方法String.valueOf(),反编译结果如下所示,注意编号为6的那一行:...是个MethodHandler的引用,指向了用户实现的lambda方法; 以上就是五种方法调用的字节码指令的简单介绍,实际上每个指令背后都对应着更复杂的调用和操作,有兴趣的读者可以通过虚拟机相关的书籍和资料继续深入学习

898100

Java虚拟机学习:方法调用的字节码指令

我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种:  1. invokespecial:调用私有实例方法; 2. invokestatic...invokedynamic:调用动态方法; 这里我们通过一个实例将这些方法调用的字节码指令逐个列出。...: invokespecial:调用私有实例方法 getValue()方法中调用了私有实例方法add(int a, int b),反编译结果如下所示,注意编号为3的那一行: public java.lang.String...invokespecial指令来实现的; invokestatic:调用静态方法 getValue()方法中,调用了静态方法String.valueOf(),反编译结果如下所示,注意编号为6的那一行:...,实际上每个指令背后都对应着更复杂的调用和操作,有兴趣的读者可以通过虚拟机相关的书籍和资料继续深入学习。

64900
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java虚拟机学习:方法调用的字节码指令

    我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种: 1. invokespecial:调用私有实例方法; 2. invokestatic:...调用静态方法; 3. invokevirtual:调用实例方法; 4. invokeinterface:调用接口方法; 5. invokedynamic:调用动态方法; 这里我们通过一个实例将这些方法调用的字节码指令逐个列出...: invokespecial:调用私有实例方法 getValue()方法中调用了私有实例方法add(int a, int b),反编译结果如下所示,注意编号为3的那一行: public java.lang.String...,调用了t.getValue(1,2)方法,反编译结果如下所示,注意编号为13的那一行: public static void main(java.lang.String[]); Code: 0:...,有兴趣的读者可以通过虚拟机相关的书籍和资料继续深入学习。

    1.3K00

    Java 虚拟机-JVM是如何执行方法调用的?(上)

    然而,Java 编译器直接将我的方法调用识别为调用第二个方法,这究竟是为什么呢? 带着这个问题,我们来看一看 Java 虚拟机是怎么识别目标方法的。...重写调用也是如此:它会根据调用者的动态类型,来选取实际的目标方法。 JVM 的静态绑定和动态绑定 接下来,我们来看看 Java 虚拟机是怎么识别方法的。...这个说法在 Java 虚拟机语境下并非完全正确。这是因为某个类中的重载方法可能被它的子类所重写,因此 Java 编译器会将所有对非私有实例方法的调用编译为需要动态绑定的类型。...确切地说,Java 虚拟机中的静态绑定指的是在解析时便能够直接识别目标方法的情况,而动态绑定则指的是需要在运行过程中根据调用者的动态类型来识别目标方法的情况。...在 Java 虚拟机中,静态绑定指的是在解析时便能够直接识别目标方法的情况,而动态绑定则指的是需要在运行过程中根据调用者的动态类型来识别目标方法的情况。

    1.8K71

    Java 虚拟机:JVM是如何执行方法调用的?(下)

    至于第二个错误,我们今天便来聊一聊 Java 虚拟机中虚方法调用的具体实现。 首先,我们来看一个模拟出国边检的小例子。...这两种指令,均属于 Java 虚拟机中的虚方法调用。 在绝大多数情况下,Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。...在 Java 虚拟机中,静态绑定包括用于调用静态方法的 invokestatic 指令,和用于调用构造器、私有实例方法以及超类非私有实例方法的 invokespecial 指令。...如果虚方法调用指向一个标记为 final 的方法,那么 Java 虚拟机也可以静态绑定该虚方法调用的目标方法。 Java 虚拟机中采取了一种用空间换取时间的策略来实现动态绑定。...否则,Java 虚拟机将采用动态绑定,在运行过程中根据调用者的动态类型,来决定具体的目标方法。 Java 虚拟机的动态绑定是通过方法表这一数据结构来实现的。

    1.5K21

    原来Java反射这么简单!!!

    反射机制 概念 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。...对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类,都拥有一个独立的类名称空间。...参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。...args): * 参数说明: * obj : 要调用方法的对象; * args:调用方式时所传递的实参...(java.lang.Object) ***************获取公有的showPhone()方法******************* public java.lang.String reflectionDemo.Student.showName

    37730

    JVM执行方法调用(一)- 重载与重写

    或者,父子类中,子类有一个方法与父类非私有方法名字相同,但是参数类型不同。那么子类的这个方法对父类方法构成重载。 JVM是怎么处理重载的?其实是编译阶段编译器就已经决定好调用哪一个重载方法。...void invoke(java.lang.Object, java.lang.Object...); Code: 0: return void invoke(java.lang.String...所以重载方法的选择是在编译过程中就已经决定的,下面是编译器的匹配步骤: 不允许自动拆装箱,不允许可变长参数,尝试匹配 如果没有匹配到,则允许自动拆装箱,不允许可变长参数,尝试匹配 如果没有匹配到,则允许自动拆装箱...,允许可变长参数,尝试匹配 注意:编译器是根据实参类型来匹配,实参类型和实际类型不是一个概念 如果在一个步骤里匹配到了多个方法,则根据形参类型来找最贴切的。...参考文档 极客时间 - 深入拆解 Java 虚拟机 - 04 | JVM是如何执行方法调用的?(上) JVM Spec - 4.3.2.

    64210

    【Java入门提高篇】Day13 Java中的反射机制

    compareTo(java.lang.Object); public int indexOf(java.lang.String, int); public int indexOf(java.lang.String...当然,反射的功能不仅仅是获取类的信息,还可以在运行时动态创建对象,回想一下,我们正常的对象使用,都是需要在代码中先声明,然后才能使用它,但是使用反射后,就能在运行期间动态创建对象并调用其中的方法,甚至还能直接查看类的私有成员变量...在开发中,经常会遇到两个不同类对象之间的复制,把一个类中的字段信息get取出来,然后set到另一个类中,大部分情况下,两个类对应的字段是一样,每次这样使用是很麻烦的,那么利用反射就可以实现一个封装,只需要调用一个方法即可实现简单的类字段复制...虚拟机在加载每一个类的时候,会自动生成一个对应的Class类来保存该类的信息,可以理解为Class类是那个类的代理类,是连接实际类与类加载器的桥梁,可以通过它来获取虚拟机的类加载器引用,从而实现更多的骚操作...,字段可访问性等,setAccessible方法可以设置字段的可访问性质,这样就能直接访问private修饰的字段了,然后使用get方法来获取指定对象的对应字段的值。

    84890

    Java 中文官方教程 2022 版(四十三)

    性能开销 因为反射涉及动态解析的类型,某些 Java 虚拟机优化无法执行。因此,反射操作比非反射操作性能较慢,并且应该避免在性能敏感应用程序中频繁调用的代码段中使用。...调用方法说明了如何执行一个方法并获得其返回值 故障排除涵盖了在查找或调用方法时遇到的常见错误 构造函数 构造函数的反射 API 在java.lang.reflect.Constructor...FieldTroubleToo示例展示了尝试设置 final 字段时产生的堆栈跟踪类型。...调用方法演示了如何执行一个方法并获取其返回值 故障排除 涵盖了在查找或调用方法时遇到的常见错误 获取方法类型信息 原文:docs.oracle.com/javase/tutorial...在类型擦除期间,继承方法Comparable.compareTo()的参数类型从java.lang.Object更改为java.lang.String。

    56800

    JAVA安全之FreeMark沙箱绕过研究

    中维护了一个freemarker-core/src/main/resources/freemarker/ext/beans/unsafeMethods.properties黑名单类用于对模板渲染过程中的类方法进行检查...方法来获得类加载器,随后再一步一步反射调用Execute类,此payload构造时需要在数据模型中找到一个作为对象的变量,这里以halo1.2.0举例,其freemarker版本为2.3.29并配置了NewBuiltinClassResolve...时可以看到ProtectionDomain.getClassLoader在2.3.30开始已经被block @whitelistPolicyAssignable的意思是这个类下面被列出来的方法就是白名单方法...,如果前面有#的就不再是白名单方法,DefaultMemberAccessPolicy-rules完整列表如下所示: # Licensed to the Apache Software Foundation...) java.lang.System.getProperty(java.lang.String,java.lang.String) java.lang.System.identityHashCode(java.lang.Object

    73120

    关于Java的反射机制,你需要理解这些..

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...类是对象,类是java.lang.Class类的实例对象。另外class类只有java虚拟机才能new出来。任何一个类都是Class 类的实例对象。...:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() … 四、获取成员变量的信息...,) java.lang.String(java.lang.StringBuffer ,) … 六、方法反射的操作 获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。..., 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

    679100

    你需要理解的 Java 反射机制知识总结

    反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...类是对象,类是java.lang.Class类的实例对象。另外class类只有java虚拟机才能new出来。任何一个类都是Class 类的实例对象。...:java.lang.String booleanequals(java.lang.Object,) java.lang.StringtoString() inthashCode() … 四、获取成员变量的信息...六、方法反射的操作 获取一个方法:需要获取方法的名称和方法的参数才能决定一个方法。..., 它可以在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

    32010

    《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    ,负责加载JVM虚拟机运行时所需的基本系统级别的类,如java.lang.String, java.lang.Object等等。...此时,JVM虚拟机调用已经加载在方法区的类sun.misc.Launcher 的静态方法getLauncher(),  获取sun.misc.Launcher 实例: sun.misc.Launcher...加载的结果;如果父加载器ExtClassLoader加载失败,AppClassLoader则会判断该类是否是引导的系统类(即是否是通过Bootstrap类加载器加载,这会调用Native方法进行查找);...加载java.lang.Object、java.lang.System、java.io.PrintStream、java,lang.Class      AppClassLoader尝试加载这些类的时候...我们经常使用的系统类如:java.lang.String,java.lang.Object,java.lang*.......

    1.4K30

    Java方法签名

    对于同名不同类、同类不同名的方法,方法签名的意义并不是很大,但是对于重载方法来说,方法签名的意义就十分巨大了。...由于重载方法之间的方法名是相同的,那么我们势必要从构成方法的其他几个要素中找到另一个要素与方法名组成能够唯一标示方法的签名,方法体当然不予考虑。...那么就是形参列表和返回值了,但是由于对于调用方法的人来说,方法的形参数据类型列表的重要程度要远远高于返回值,所以方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法...,方法返回值没有什么意义,是由方法名和参数列表决定的 利用javap生成方法签名 $ javap -s java.lang.String Compiled from "String.java"...public final class java.lang.String extends java.lang.Object implements java.io.Serializable,java.lang.Comparable

    4.8K30
    领券