当前位置: 首页 > 网络应用技术

Java方法调用的基础实现

时间:2023-03-06 11:08:49 网络应用技术

  我们编写的代码在编译和类加载后输入了JVM的运行时数据区域。

  但是,作为程序员确实关心代码的执行,代码的执行实际上是该方法的实现。在JVM的最后点,执行字节代码。

  主要功能是JVM指令执行的起点。JVM将创建主线程以执行主函数,以触发JVM的一系列指令的执行并真正运行JVM。

  然后,在我们的代码中,这是方法调用方法的过程,因此有必要了解JVM中该方法的方法。

  方法的执行是通过调用字节码指令来实现的,并且类,字段,方法和接口描述在类Constant Pool中的信息。池形式的池。

  附件:Java字节码指令

  说,我们只是写了一种查看它的方法(一种查看字节码的工具),这似乎很不舒服,如下所示::

  我们知道该方法在哪里,但是我们如何称呼它?关于方法调用,Java提供了5个指令来调用不同类型的方法:

  静态方法,实例方法等。我们经常说,实际上,他们有一个更正式的说法:错误的方法和非缺陷方法。

  什么是非曲子方法?

  如果该方法是在编译期中确定的,则确定特定的呼叫版本。此版本在运行时不变。这样的方法称为非false方法。从基础上讲,包括以下五种类型:

  简而言之,这是通过指令调用的方法。让我们验证它。

  调用静态方法:

  查看字节代码:

  我们可以看到,主要方法的字节码为:

  我们知道,静态方法调用了什么,它代表了什么?当我们检查时,我们发现背后有评论,即方法。

  该方法称,在编译期间,它以恒定池的形式清楚地以字节代码指令的形式巩固。

  调用私人实例方法,构造函数,超级关键字等。

  仍然是通过以下方式实例化的上述代码:

  查看字节代码:

  发现调用实际上是结构方法的字节代码。

  指令和说明是静态绑定过程。在上一篇文章中JVM的类加载中,类的分析阶段是将JVM常数池中的符号引用替换为直接参考的过程,也就是说,该方法将具有在实际操作之前的某个呼叫版本,该方法的调用将被称为该版本在运行期间不可变。还可以说,可以知道编译器的呼声称为解析。

  非虚拟方法与静态链接之间的关系:

  非虚拟方法的呼叫将在类的分析阶段将符号引用转换为直接参考。此过程称为静态链接。

  那么什么是虚拟方法?

  这很简单。这是一种虚拟方法,不属于非false方法,即该方法在运行时是可变的。

  很多时候,JVM需要根据调用者的动态类型来确定呼叫的目标方法,这是动态绑定的过程。例如,上述不是一种方法,我们找到了指令。

  因为说明与界面相似,所以我们只需要熟悉。

  对于动态绑定过程,动态连接和虚拟方法之间有什么关系?

  在JVM的内存结构中仍然提到了它:运行时数据区域:

  在线程的私有区域中,当前线程的虚拟机堆栈存储了JVM操作,指令和返回地址期间当前线程运行方法所需的数据。并且每个方法都包装到虚拟机堆栈中的堆栈框架中:

  堆栈框架通常包括四个区域:(本地变量表,操作号码堆栈,动态连接,返回地址)

  当时动态链接的定义是:

  每个堆栈框架都包含对运行常数池中堆栈框架的属性方法的引用。它具有此参考,以支持调用方法调用过程中的动态连接。在类文件的常数池中,有大量符号引用。在常数池中该方法的符号引用该方法中调用该方法的方法。这些符号参考部分将在类加载阶段或首次使用中转换为直接引用。此转换称为静态解析(静态链接)。另一部分将在每个运行时期转换为直接参考,这称为动态连接。

  PS:现在回头看很清楚吗?

  动态连接和虚拟方法之间的关系:

  虚拟方法将在程序的操作阶段将符号引用转换为直接参考。此过程称为动态连接。

  虚拟方法中有一个划分的概念,但是分布和链接不是一个概念级别,并且分布描述了确定方法版本的过程,即虚拟机如何确定应执行哪种方法。

  我们知道Java是一种面向对象的编程语言,因为Java具有三个基本特征:继承,包装和多态性。分发过程将揭示多态特征的最基本表现(没有人会学会Java并且不知道Java并且不知道多态性?),例如如何在Java虚拟机中实现重载和重写。

  静态分布的静态分布在方法()中更常见。

  重新载荷:允许同一名称同时存在的类,这些方法的参数数量或类型是不同的

  如前所述,我们知道无法复制非缺陷方法(静态方法,构造函数等),因此自然不会产生子类别的多态性效应。但是可以加载它(例如,构造方法,是参数和非参数)。

  在这种情况下,该方法称为一个只有一个,并且编译器可以知道,即JVM需要执行哪种方法由编译器确定,并且在运营期间不会更改。用于采访的常见栗子:

  从“更深的Java Virtual Machine-JVM高级功能和最佳实践”中

  此代码主要方法执行的结果:

  查看字节码发现:

  分析:

  因此,我们可以得到静态分布的定义:

  根据变量的依赖静态类型,执行该方法的方法确定该版本的方法称为静态分布。因此,Java中重负荷的方法是静态分布,并且静态分布已在编译器中完成。运行期不会改变,因此也有静态分配作为类负载的分析类别。

  相反,程序中的程序中可能会发生一些更改。区别在于,静态类型的变化仅在使用过程中发生。变量本身的静态类型不会更改。可以在运行时确定实际更改类型的结果。编译程序时,编译器不知道对象的实际类型是什么。

  如何理解?我们在主要方法中更改代码:

  结果输出是:

  动态分布我们已经知道,基于变量的静态类型的方法的划分确定该方法称为静态分布。然后,根据实际类型对应于该方法的运动动态分布的划分,在重写方法()的方法中更常见动态分布。

  重写:在子类中保留父类成员的名称,重写成员资格方法的内容,更改方法的访问权限,然后将子类的返回类型修改为父类。

  重写还用于使用指令,目前是多态性的。该指令具有多态性的机制。指令运行时,分析过程如下:

  让我们看看以下代码:

  输出:

  方法表动态除法将执行非常频繁的动作。JVM运行时会经常并反复搜索元数据,因此JVM使用优化方法。这是在方法区域中建立虚拟方法表。

  使用虚拟方法表吸引替代元数据以找到性能。

  在实施方面,最常用的方法是在方法区域中建立虚拟方法。每个方法的实际入口地址存储在虚拟方法表中。如果未在子类中重写一个方法,则在地址入口中的地址入口子类的虚拟方法与父类相同方法的地址条目以及父类的实现相同。如果在子类中重写此方法,则将在子类方法表中替换地址子类实现版本的版本的输入地址。

  儿子重写了父亲的所有方法,因此儿子方法表不指父亲类型数据的箭头。但是,否则,儿子和父亲都没有从对象重写该方法,因此所有方法从对象中继承的所有方法都指向数据指向数据对象类型。

  根据单个细分和多点分布的数量,可以将划分分为单个分区和多点派系。那么数量是多少?

  该方法的接收者和方法的参数共同称为数量。根据祖先的数量,可以将分布分为单个分区和多点派系。基于数量方法选择该方法,并且根据多个祖先的方法,选择称为多点派系数量。

  自Sun Company的第一台Java虚拟机以来,已经添加了Java虚拟机的字节码指令集,并且仅添加了一项指令超过20年。Member -Instructions。此新添加的指令是JDK 7的项目目标:要实现动态类型的语言(动态键入语言),它也是JDK 8的技术储备,以实现表达。

  那么什么是动态类型的语言?我看到了这样的图片(可能是有争议的,自己理解)

  一般摘要如下:

  动态类型语言类型测试是,在运行时使用变量之前,不需要变量类型JavaScript静态类型语言类型判断。语言,Java是一种动态语言?一般而言,它被定义为静态语言。上面介绍的说明,没有确切的接受对象。

  Lambda的表达方式说,这种表达是通过动态语言实现的。让我们验证它:

  我们检查此类的字节代码:

  表达式通过指令调用,对于指令的底层,它由方法handle()实现。方法句柄是可以执行的参考,可以指向静态方法和实例方法。

  方法手柄方法手柄是可以直接执行的强类型。此引用可以指向常规的静态方法或示例方法,或者它也可以指向构造函数或字段(包括私有)。指向字段时,方法句柄是真实的,可以指向访问包含该字段的字节代码的虚构方法,该字段等效于目标字段或方法。

  官方文件:https://docs.oracle.com/javase/7/docs/api/java/invoke/methodhandles.html

  说了很多概念,让我们练习。当然,这只是一个简单的测试,否则我写的是我写的。

  使用MethodHandle调用该过程:

  输出:

  如果您不理解此示例,建议阅读本文。最主要的是如何使用:Java方法的方法句柄(MethodHandle)

  我们考虑到这一点,甚至可以访问方法处理方法,它与Java中的反射有什么关系?换句话说,上面的代码可以通过反射实现。

  当Java最初发布时,它支持反射。它可以在运行时通过反射获取类型信息,但其缺点是执行速度较慢。因此,Java 7中还有另一组。其执行效率高于反思,也称为Java的现代反射。

  有这样的词:使用就像用Java编写字节代码。

  该语句是有道理的,因为MethodHandle中的许多操作对应于相应的字节对应(Findxxx)。从总体上讲,它与以应用程序为导向的程序员的反射和日常开发相同,因为我不了解方法处理方法,并且反思,我可以发展,你说是的。

  原始:https://juejin.cn/post/7102981166705147940