首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我在invokeExact上得到一个WrongMethodTypeException,即使MethodHandle是OK的

在Java语言中,MethodHandle是一种用于执行动态方法调用的对象。它可以绕过Java语言中的静态类型检查,实现更加灵活的方法调用。而invokeExact方法是MethodHandle类中的一个方法,用于精确地执行方法调用。

当在invokeExact方法上得到一个WrongMethodTypeException异常时,通常是由于以下原因之一:

  1. 参数类型不匹配:invokeExact方法要求精确匹配方法的参数类型。如果传递给invokeExact方法的参数类型与目标方法的参数类型不匹配,就会抛出WrongMethodTypeException异常。解决方法是确保传递给invokeExact方法的参数类型与目标方法的参数类型完全一致。
  2. 返回类型不匹配:invokeExact方法还要求精确匹配方法的返回类型。如果目标方法的返回类型与invokeExact方法的返回类型不匹配,同样会抛出WrongMethodTypeException异常。解决方法是确保目标方法的返回类型与invokeExact方法的返回类型完全一致。
  3. MethodHandle对象类型不匹配:MethodHandle对象是通过MethodHandles.lookup()方法获取的,它与目标方法的类型必须匹配。如果MethodHandle对象的类型与目标方法的类型不匹配,也会导致WrongMethodTypeException异常的抛出。解决方法是确保MethodHandle对象的类型与目标方法的类型完全一致。

总结起来,当在invokeExact方法上得到一个WrongMethodTypeException异常时,需要检查参数类型、返回类型以及MethodHandle对象类型是否与目标方法完全匹配。确保这些匹配后,即可成功执行方法调用。

腾讯云提供了Serverless云函数(SCF)服务,可以帮助开发者快速构建和部署无服务器应用。SCF支持Java语言,并且提供了MethodHandle相关的API和文档,可以帮助开发者解决MethodHandle相关的问题。您可以访问腾讯云SCF的官方文档了解更多信息:腾讯云SCF官方文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解 JDK 中 MethodHandle

作者:梁德泉 Java一个支持反射语言,从诞生那一刻起就已经支持了反射。...反射调用也是支持多态,并且和Method不同MethodHandle成员方法要线bindTo到某个instance,bind过程中已经做了类型检查;而Method成员方法左值和函数参数一起传入...注意到MethodHandle比Method多了一个invokeExact方法,它与invoke区别是方法参数、返回值匹配非常严格,调用时如果有数值参数隐式转换(如short转int/子类转父类)、装箱拆箱...Java源码层面/运行表现层面来看,两者区别并不大,那为什么会在JDK新引入、MethodHandle这个特性呢?...MethodHandle文档描述中还有一点值得关注:MethodHandle访问性检查只创建时检查一次,而Method则是每次调用都检查。

5.2K00

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

JMH一个用于编写、运行和分析Java微基准测试框架。它可以帮助你编写出更可靠、可重复基准测试。...在上面的例子中,单位Units,这实际一个占位符,因为我们@OutputTimeUnit(TimeUnit.NANOSECONDS)注解中指定了输出单位为纳秒(NANOSECONDS)。...事实并未如此,如果我们必须在static final中指定需要使用到反射字段,那么就相当于损失了绝大多数灵活性,实际操作中可行性并不高。...Lambda表达式生成性能,一个测试Lambda表达式运行性能,这两个指标对我们来说都非常重要,得到结果如下: ReflectionTest.testLambdaGeneration 10000...小结 本文介绍了一种Java中反射调用方式,即使用类似于Lambda表达式生成方式进行反射,可以将一些简单方法,例如get和set方法,直接转化为相应Lambda表达式来调用,虽然可以做到和直接调用一致性能

23910

Java 虚拟机:JVM怎么实现invokedynamic?(

举个例子,对于一个私有字段,如果 Lookup 对象是私有字段所在类中获取,那么这个 Lookup 对象便拥有对该私有字段访问权限,即使在所在类外边,也能够通过该 Lookup 对象创建该私有字段...它会往传入参数中插入额外参数,再调用另一个方法句柄,它对应 API MethodHandle.bindTo 方法。...刚刚提到过,invokeExact 会对参数类型进行校验,并在不匹配情况下抛出异常。如果它直接调用了方法句柄所指向方法,那么这部分参数类型校验逻辑将无处安放。...那么前面那个适配器中优化又是怎么回事?实际,方法句柄一开始持有的适配器共享。当它被多次调用之后,Invokers.checkCustomized 方法会为该方法句柄生成一个特有的适配器。...总结与实践 今天介绍了 invokedynamic 底层机制基石:方法句柄。 方法句柄一个强类型、能够被直接执行引用。

98030

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

Memory Model 分析memory order之前,我们先讲一下为什么要考虑memory order问题,这里需要简单分析一下多线程编程环境中内存模型。...上图所示一个典型多核CPU系统架构,它包含有2个CPU核,每个CPU核有一个私有的32KB L1 cache,两个CPU 核共享 1MB L2 cache 以及 512MB主存。...acquire本质read-acquire,它只能应用在从RAM中read数据这种操作,它确保了所有acquire之后语句不会被调整到它之前执行,如下图所示。...release本质write-release,它只能应用在write数据到RAM中,它确保了所有release之前语句不会被调整到它之后执行,如下图所示。...,acquire本意acquire a lock,release本意release a lock,因此,互斥锁能保证被锁住区域内得到数据不会是过期数据,而且所有写入操作release之前一定会写入内存

4K21

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

方法句柄一个有类型,可以直接执行指向底层方法、构造器、field等引用,可以简单理解为函数指针,它是一种更加底层查找、调整和调用方法机制。...提示 OptaPlanner一个开源轻量级、可嵌入约束满足引擎,可求解规划问题,100%由Java编写,可以在任何JVM运行,也可以Maven中央存储库中使用、支持多种平台下载。...mh,想要做到具有通用性、且高效Methodhandle需要结合LambdaMetafactory;如果不会使用LambdaMetafactory、字段不多情况下选择static化mh同样选择...不会比直接反射更快使用时应该注意这一情况,静态化之后,反射和MethodHandle得到了显著效率提升,此时MethodHandle效率更高。...值得注意,虽然本文场景2中MethodHandle性能并没有提高多少,但依据社区测试经验[10],大多数情况下,一个正确使用MethodHandle性能上依旧会比反射领先,可作为基础组件不二之选

1.7K40

JDK1.8下关于MethodHandle问题

最近在读《深入理解java虚拟机》第二版,JDK1.8环境下遇到一个关于MethodHandle使用上问题,在这里记录下。...为什么跟预想不一致 引子 《深入理解java虚拟机》第二版第8章,提出了一个问题,简要描述如下: Son类中,调用GrandFatherthinking方法,打印 I 'm grandFather...MethodHandles.lookup()对应findXXX方法,获取目标方法MethodHandle对象。    调用MethodHandle对象invokeExact方法。...但是 **该解法JDK1.8下不行**,运行结果I’m father ? JDK1.8为什么跟预想不一致? 为什么1.8跟预想不一致?...Reflection模拟Java代码层次调用,而MethodHandle模拟字节码层次方法调用。 Reflection重量级,而MethodHandle轻量级。

1.4K80

跟妹妹聊到 Java 16 新特征,真香!

看完之后觉得这次更新还是很有意思就精选几个Java16新特性,供大家一饱眼福!...新打包工具 提供了一个打包工具jpackage,用来打包独立Java应用程序。这个工具可以生成windowsexe和msi,MacOSpkg和dmg,以及linuxdeb和rpm。...compar,为了使用它,我们首先要得到MethodHandleMethodHandle qsort = CLinker.getInstance().downcallHandle(...使用密封类,还有一些限制,比如: 子类必须直接继承,而不是间接 子类必须说明如果处理得到密封属性,三选一,必选一个: 子类标记为final,一了百了 子类也作为sealed类,并做有限继承扩展...不要犹豫了,下一个试试? 阿丙友情提示:不要在自己项目中尝试最新版本,等稳定后再尝试,可以自己demo和自己项目尝试。 敖丙,你知道越多,不知道越多,我们下期见。

76040

方法引用(Method reference)和invokedynamic指令详细分析

给出) 一个启动方法数组(由bootstrap_method_attr_index给出) 2.手动解析 可以手动模拟一下解析,看看最后得到数据是什么样。...+描述符:Encode.encode(),启动方法数组有一个元素,回忆下之前说,这个元素构成如下: {指向MethodHandle索引,启动方法参数个数,启动方法参数} 这里得到MethodHandle...当这个函数返回CallSite被调用时候,会产生一个实例,该类还实现了一些方法,具体由参数给出 将上面得到MethodHandle写得更可读就是调用这个方法: public static...,Dump出虚拟机生成得到: import java.lang.invoke.LambdaForm.Hidden; // $FF: synthetic class final class MethodReference...buildCallSite()会创建一个.class, buildCallSite()会向最后CallSite里面放入一个可调用MethdHandle 这个MethodHandle指向一个总是返回刚刚创建

89610

深入探究JVM之方法调用及Lambda表达式实现原理

这里解释看似合情合理,但仍然有一个问题,调用子类构造器首先会调用父类构造器,也就是说这时候子类还没有初始化完成,那为什么父类就可以调用子类实例方法呢?...实际虚拟机方法区会为每个类型建立一个虚方法表(支持invokevirtual 指令)以及接口方法表(支持invokeinterface指令),如下图: ?...从这个属性我们可以发现Lambda表达式最终是通过MethodHandle方法句柄来实现,虚拟机会执行引导方法并获得返回CallSite对象,通过这个对象最终调用到我们自己实现方法。...,最终通过这个对象invoke或者invokeExact方法就能调用实际想要调用对象方法(这里需要注意前者松散匹配,即可以自动转型,而后者则必须精确匹配,参数返回值类型都必须一样,否则就会报错...另外为什么会出现MethodHandle类,它能给我们带来哪些便利,熟悉并掌握可以让我们写出更灵活程序。

71130

disruptor笔记之七:等待策略

固定返回0,个人觉得这个策略正常开发中用不,因为环形队列可用位置始终是0的话,不论生产还是消费都难以实现: LiteBlockingWaitStrategy 看名字,LiteBlockingWaitStrategy...BlockingWaitStrategy策略轻量级实现,锁没有竞争时候(例如独立消费场景),会省略掉唤醒操作,不过如下图红框所示,作者说他没有充分验证过正确性,因此建议只用于体验,太好了,这个策略不学了...没有用到锁,这意味这无需调用signalAllWhenBlocking方法做唤醒处理,相当于省去了生产线程通知操作,官方源码注释有这么句话引起了兴趣,如下图红框,大意该策略性能和CPU资源消耗之间取得了平衡...,接下来去看看关键代码,来了解这个特性: 如下图,等到可用数据过程个死循环: 接下来关键代码了,如下图,可见整个等待过程分为三段:计数器高于100时就只有一个减一操作(最快响应),计数器100...,然后不断交出CPU时间: 由于不断执行Thread.yield()方法,因此该策略虽然很消耗CPU,不过一旦其他线程有CPU需求,很容易从这个线程得到; PhasedBackoffWaitStrategy

64220

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

Java为什么需要lambda表达式? 能够提升代码简洁性、提高代码可读性。 例如,平时开发过程中,把一个列表转换成另一个列表或map等等这样转换操作一种常见需求。...,即使传过来类型中也恰好有一样方法签名也不行。...JVM第一次解析时,调用用户定义bootstrap method bootstrap method会返回一个CallSite CallSite中能够得到MethodHandle,表示方法指针 JVM之后调用这里就不再需要重新解析...,直接绑定到这个CallSite,调用对应target MethodHandle,并能够进行inline等调用优化 第一行invokedynamic后面有两个参数,第二个0没有意义固定为0 第一个参数...JVM虚拟机一个基本保证就是低版本class文件也是能够高版本JVM运行,并且JVM虚拟机通过版本升级,不断优化和提升性能

65120

报告,书里有个BUG!

你好呀,why。 这样在看《深入理解 JVM 虚拟机》(第三版)时候发现一个有意思 BUG。 给大家汇报一下。...但是当你粘出来运行时候,有趣事情发生了: 什么情况,为什么书上运行结果这样? 诶,这就是 BUG 体现了。 为啥这样?...知乎找到了关于这个问题R大回答: https://www.zhihu.com/question/40427344 首先这个神一样男人,直接就说书上结论错误。...最后,R大也指出,曾经有这样 bug 存在,所以也有可能存在示例代码中结果: 可能是因为findSpecial()得到MethodHandle具体语义JSR 292设计过程中有被调整过。...有一段时间findSpecial()得到MethodHandle确实可以超越invokespecial限制去调用到任意版本虚方法,但这种行为很快就被认为bug而修正了。

35120
领券