首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏社区的朋友们

    理解 JDK 中的 MethodHandle

    但是从Java7开始,JDK中又多了一个功能类似的成员,java.lang.invoke.MethodHandle。 { MethodType mt = MethodType.methodType(int.class, Boolean.class); MethodHandle mh = 在Java源码层面/运行表现层面来看,两者区别并不大,那为什么会在JDK在新引入、MethodHandle这个特性呢? 在MethodHandle的文档描述中还有一点值得关注:MethodHandle的访问性检查只在创建时检查一次,而Method则是每次调用都检查。 虽然MethodHandle能力相对受限,不过性能确高了很多(两者的实现对比解析待续…)。

    5.6K00发布于 2017-09-14
  • MethodHandle方法句柄使用分享

    一.总述JDK1.7为间接调用方法提供了MethodHandle类,即方法句柄。 调用方法的流程为:创建MethodType,获取指定方法的签名在Lookup中查找MethodType的方法句柄MethodHandle传入方法参数通过MethodHandle调用方法创建MethodTypeMethodType 表示一个方法类型的对象,每个MethodHandle都有一个MethodType实例,MethodType用来指明方法的返回类型和参数类型。 ,相当于MethodHandle的工厂方法。 对象如果MethodHandle指向的是实例方法,可以使用MethodHandle对象的bindTo()方法将其绑定到目标实例上使用MethodHandle对象的invoke()、invokeExact

    29210编辑于 2024-09-18
  • 来自专栏快乐阿超

    java MethodHandle转反射对象

    最近在看MethodHandle相关内容,我们将MethodHandle转反射的Executable对象,可以这么使用: final Executable executable = MethodHandles.reflectAs (Executable.class, methodHandle); 当然你也可以这么用: final MethodHandles.Lookup lookup = MethodHandles.lookup (); MethodHandle methodHandle = lookup .findStatic(Test.class, "myMethod", MethodType.methodType (resultType, paramerType)); Method method = lookup.revealDirect(methodHandle).reflectAs(Method.class

    58320编辑于 2022-08-21
  • 来自专栏温安适的blog

    JDK1.8下关于MethodHandle问题

    最近在读《深入理解java虚拟机》第二版,在JDK1.8环境下遇到一个关于MethodHandle使用上的问题,在这里记录下。 MethodHandles.lookup()对应的findXXX方法,获取目标方法的MethodHandle对象。    调用MethodHandle对象的invokeExact方法。 与java.lang.reflecct包的区别 MethodHandle服务于所有java虚拟机上的语言,Reflection仅仅服务于java语言。 Reflection在模拟Java代码层次的调用,而MethodHandle在模拟字节码层次的方法调用。 Reflection是重量级,而MethodHandle是轻量级。 MethodHandle可以进行内联优化,Reflection完全没有。 总结 Java一致在更新,也越来越严禁,看书时,一定要注意对比最新的官方文档。

    1.6K80发布于 2018-05-17
  • 来自专栏后端知识体系

    MethodHandle结合LambdaMetafactory-使用方法及性能测试

    从JDK7开始,MethodHandle被推出,用于解决反射的效率问题。在JDK8,MethodHandle又与Lambda进行深度结合,成为Lambda的最底层调用方式。 在JDK9,MethodHandle又被进一步增强。 在开源项目中,Mybatis Mapper的动态代理实现则运用了MethodHandle。 # MethodHandle性能测试 # 前言 参考StackOverflow[2]和OptaPlanner引擎论坛[3]对MethodHandle的测试结果,大多数情况下,mh的执行效率接近原生,但随着 MethodHandle,同时做出性能测试。 是不会比直接反射更快的,在使用时应该注意这一情况,在静态化之后,反射和MethodHandle都得到了显著的效率提升,此时MethodHandle效率更高。

    2.6K40编辑于 2023-02-14
  • 来自专栏Java架构师必看

    关于使用MethodHandle在子类中调用祖父类重写方法的探究

    关于使用MethodHandle在子类中调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下 但是在我们这个MethodHandle的例子中,相当于是模拟了invoke*指令的处理,手动调用invoke方法就需要指定这个"this"参数。 因为在处理逻辑中需要做强转,然后再绑定方法接受者: public MethodHandle bindTo(Object x) { Class<?

    11.3K30发布于 2021-11-29
  • 来自专栏纯洁的微笑

    装逼利器,看完这篇,让只懂反射的同学仰视你

    MethodHandle是Java7引入的一种机制,主要是为了JVM支持动态语言。 一个MethodHandle调用示例 首先,让指北君给大家演示一下最基本的MethodHandle使用。 包含: changeParameterType insertParameterTypes appendParameterTypes dropParameterTypes MethodHandle MethodHandle 这部分涉及MethodHandle的机制实现,对于使用功能来说指北君就不在此展开了。 调用方法 MethodHandles, Lookup MethodHandles不是MethodHandle的实现,他提供工具用于帮助获取MethodHandle,我们主要使用到lookup(),publicLookup 最后,通过Lookup的findXXX获取到MethodHandle,详细说明见下表: ? 查找方法 小结 关于MethodHandle的基本使用就基本讲完,这里指北君附上一张类图便大家理解: ?

    62020发布于 2021-07-01
  • 来自专栏快乐阿超

    获取lambda

    MethodType.methodType(SerFunc.class), MethodType.methodType(Object.class, Object.class), methodHandle String.class, LambdaExecutable.class), LambdaMetafactory.FLAG_SERIALIZABLE ); final MethodHandle .orElseThrow(() -> new UtilException("not a functional interface")); final MethodHandle Method) { final Method method = (Method) executable; implMethod = ((SerSupp<MethodHandle >) executable; implMethod = ((SerSupp<MethodHandle>) () -> MethodHandles.lookup().unreflectConstructor

    72630编辑于 2022-12-20
  • 来自专栏魔法书

    更高效的反射调用方式被我找到了!

    先让我们试一下MethodHandle提供的方法调用模型,MethodHandle是自JDK7版本后开始推出的,用于替换旧反射调用的新方式,相比起原有的反射调用,提供了更多的交互方式,并且具备对Java constructorHandle = lookup.findConstructor(Test.class, constructorType); MethodHandle iSetter 进行实现,很明显,在使用java.lang.reflect和java.lang.invoke中的方法时,与直接使用MethodHandle相比,具备了更多的优化工作,根据官方的说法,在使用MethodHandle 时因将字段尽可能定义为static final,这样JVM可以将其进行常量折叠,从而实现巨大的性能提升,让我们修改一下以上的测试代码: private static final MethodHandle constructorHandle; private static final MethodHandle iSetter; private static final MethodHandle

    60710编辑于 2024-03-21
  • 来自专栏深入浅出Java

    反射太慢?那是你不会用LambdaMetafactory!

    和CallSite机制工作,它能够在运行时通过ASM字节码库生成lambda内部类来调用目标方法,从而兼得反射的灵活性与直接调用的性能优势MethodHandle是方法句柄,通过它可以灵活调用目标方法; CallSite用于动态管理存储方法句柄MethodHandle,它们是实现动态调用的关键LambdaMetafactory的核心在于其LambdaMetafactory.metafactory方法该方法根据目标方法 、接口方法等数据来定义目标lambda的行为,并返回一个CallSite对象后续通过获取CallSite的目标方法句柄进行调用使用方法通常分为以下几个步骤:使用Lookup查找要调用的目标方法句柄MethodHandle 根据要生成的lambda方法名、调用接口、目标方法类型(返回、入参类型)、句柄等信息创建CallSite根据CallSite的MethodHandle获取生成的函数接口实现类再调用接口方法定义的函数式接口 targetMethod, // 目标方法句柄 methodType // 目标方法类型 ); // 获取并调用 MethodHandle

    66822编辑于 2024-12-25
  • 来自专栏微信公号【Java技术江湖】

    Java8特性详解 lambda表达式(三):原理篇

    MethodHandle,它是在JDK7中与invokedynamic指令等一起提供的新特性。 但直接使用MethodHandle来实现,由于没有签名信息,会遇不能重载的问题。 并且MethodHandle的invoke方法性能不一定能保证比字节码调用好。 CallSite: 负责通过getTarget()方法返回MethodHandle MethodHandle: MethodHandle表示的是要执行的方法的指针 再串联起来梳理下 invokedynamic , or CONSTANT_MethodType_info structure CONSTANT_MethodHandle_info The CONSTANT_MethodHandle_info structure invokedynamic链接完之后,后面的调用就直接调用到对应的MethodHandle了,具体是实现就是返回固定的内部类对象,或每次创建新内部类对象。

    91920编辑于 2021-12-13
  • 来自专栏shysh95

    同事:Lambda都不懂,还写什么Java

    CallSite对象是一个MethodHandle(方法句柄)的holder。方法句柄指向一个调用点真正执行的方法。下图是CallSite类的源码,可以看到在该对象中,有一个方法句柄target。 MethodHandle中有两个方法能够触发对方法句柄的调用,invoke和invokeExtract()。这两个方法都是以接收者和调用变量作为参数。 #22 = MethodHandle #6:#37 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory (MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodType samMethodType, MethodHandle void accept(Object var1) { this.arg$1.println((String)var1); } } 最后就是创建一个CallSite,绑定一个MethodHandle

    54410发布于 2021-02-25
  • 来自专栏Java架构师必看

    《深入理解Java虚拟机》读书笔记(七)–虚拟机字节码执行引擎(下)

    1.1 MethodHandle JDK1.7 在除了之前单纯依靠符号引用来确定调用的目标方法的方式外,提供了一种新的动态确定目标方法的机制,称为MethodHandle。 其功能大体上就是在一个class中寻找方法签名匹配的方法,结果以MethodHandle表示,然后可以通过MethodHandle调用该方法。 而MethodHandle仅包含于执行该方法相关的信息,比如方法名和参数等,相对来说是轻量级的。 由于MethodHandle是对字节码的方法执行指令的模拟,所以理论上虚拟机在这方面做的各种优化(比如方法内联),在MethodHandle上也应当可以采用类似的思路去支持,而通过Reflection去调用方法则不行 Reflection的设计目标是只为Java语言服务的,而MethodHandle则设计成可服务于所有Java虚拟机之上的语言。

    41420发布于 2021-11-29
  • 来自专栏码农架构

    Java 虚拟机:JVM是怎么实现invokedynamic的?(上)

    mh0 = l.unreflect(m); MethodType t = MethodType.methodType(void.class, Object.class); MethodHandle invoke 会调用 MethodHandle.asType 方法,生成一个适配器方法句柄,对传入的参数进行适配,再调用原方法句柄。调用原方法句柄的返回值同样也会先进行适配,然后再返回给调用者。 这其中,改操作就是刚刚介绍的 MethodHandle.asType 方法。删操作指的是将传入的部分参数就地抛弃,再调用另一个方法句柄。 它会往传入的参数中插入额外的参数,再调用另一个方法句柄,它对应的 API 是 MethodHandle.bindTo 方法。 后者会在方法句柄的执行次数超过一个阈值时进行优化(对应参数 -Djava.lang.invoke.MethodHandle.CUSTOMIZE_THRESHOLD,默认值为 127)。

    1.3K30发布于 2021-02-14
  • 来自专栏得物技术

    浅析JVM invokedynamic指令和Java Lambda语法|得物技术

    CallSite就是一个 MethodHandle(方法句柄)的holder,方法句柄指向一个调用点真正执行的方法。 一阶段:调用引导方法确定并缓存CallSite(MethodHandle)二阶段:调用CallSite(MethodHandle)字节码指令比较low level,除字节码业务插桩场景外,字节码指令序列的构造 上述为MethodHandle API的基本使用,该课题展开又是一篇长文。 MethodHandle(方法指针/方法引用),【二阶段】调用就是调用这个MethodHandle。 并调用该MethodHandle,继而得到IntStream.map方法需要的参数:IntUnaryOperator。

    39610编辑于 2024-08-27
  • 来自专栏大内老A

    怎样让1+1=3?

    = ((MethodCallExpression)targetCall.Body).Method; RuntimeHelpers.PrepareMethod(originalMethod.MethodHandle ); RuntimeHelpers.PrepareMethod(targetMethod.MethodHandle); var sourceAddress = originalMethod.MethodHandle.GetFunctionPointer (); var targetAddress = (long)targetMethod.MethodHandle.GetFunctionPointer(); int offset = (

    77430发布于 2019-09-29
  • 从反射到方法句柄:深入探索Java动态编程的终极解决方案

    特性反射 (Method.invoke)方法句柄 (MethodHandle.invoke)性能慢,JIT 优化困难快,接近普通方法调用,JIT 易于优化类型检查弱类型,参数和返回值都是 Object强类型 示例: MethodType.methodType(String.class, int.class, String.class)MethodHandles.Lookup (查找器):这是获取 MethodHandle MethodHandle (方法句柄):一旦获取,就可以通过 invoke 或 invokeExact 来调用目标方法。 避免装箱/拆箱: MethodHandle 的类型匹配是基于 MethodType 的,允许更高效的参数传递,很多时候可以避免反射中必须的参数装箱/拆箱。3. 它通过一个**引导方法(Bootstrap Method, BSM)**来动态地生成并返回一个 CallSite,这个 CallSite 内部持有最终要执行的 MethodHandle

    16510编辑于 2025-10-11
  • 来自专栏ImportSource

    JDK11中增加了一个常量池类型:CONSTANT_Dynamic

    这里贴上一段代码你可以简单体验一下java7中新增的有关动态语言的API: import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles 查找到这个这个方法以后,返回的是一个MethodHandle对象,此对象封装了hello方法的全部信息,然后我们调用invokeExact方法来执行hello方法,然后打印出hello。 ? 你也发现了,这里我们又看到了MethodHandle和MethodType了。在java7中也对虚拟机规范添加了这两个对应的常量类型。 Adding new constant-pool forms, such as the support for MethodHandle and MethodType introduced in Java 大体上说就是说虚拟机规范在Java7的时候新增了MethodHandle和MethodType两个常量类型。

    1.8K10发布于 2018-07-25
  • 来自专栏社区的朋友们

    当我们在谈论 memory order 的时候,我们在谈论什么

    VarHandle类可以由MethodHandle类进行生产,代码示例如下: class Foo { int i; ... } ... 用VarHandle类反射获取MethodHandle类的方法如下: Foo f = ... MethodHandle mhToVhCompareAndSet = MethodHandles.publicLookup().findVirtual( VarHandle.class, 的代码如下: boolean r = (boolean) mhToVhCompareAndSet.invokeExact(VH_FOO_FIELD_I, f, 0, 1); MethodHandle 的更多使用方法可以参考文章理解JDK中的MethodHandle

    4.3K21发布于 2017-09-12
  • 来自专栏Java帮帮-微信公众号-技术文章全总结

    通过字节码分析JDK8中Lambda表达式编译及执行机制【面试+工作】

    对象,然后这个MethodHandle对象传给CallSite对象(通过CallSite的构造函数赋值)。 所以这样就完成了一个将lambda表达式转化成一个内部类对象,然后将内部类通过MethodHandle绑定到一个CallSite对象。CallSite对象就相当于lambda表达式的一个勾子。 所以lambda的脱糖也就是在运行期通过bootstrap method的字节码信息,转化成一个MethodHandle的过程。 在运行时,JVM会通过调用这个引导方法生成一个含有MethodHandle(CallSite的target属性)对象的CallSite作为一个Lambda的回调点。 ,并通过MethodHandle调用Lambda的内部表示形式LambdaForm。

    2.2K11发布于 2018-09-29
领券