首页
学习
活动
专区
工具
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官方文档

相关搜索:为什么我得到一个意外的类型,需要变量的错误?即使我使用的是变量为什么我得到一个错误,因为没有一个返回语句,即使我有一个在我的for循环?为什么即使我的代码在我的python空闲上运行得很好,我也会在HackerRank中得到一个EOF错误?为什么我的函数返回true,即使我的一个条件是错误的?为什么我得到一个"this2“是未定义的?为什么在Heroku中我的发布日志是空的,即使我运行echo?为什么我得到"Fetch failed loading“,而它实际上是有效的?为什么我在CSS网格中得到的是列而不是行?为什么我在console.log上得到的下拉值是‘`undefined’?为什么在我的显示功能之后,我得到了一个无?为什么我在Django的模型上得到一个KeyError?一个简单的哈希数组循环,我得到了错误警告,即使它工作,为什么?当我试图在GoogleMap上放置一个标记时,为什么我得到一个NullPointerException?为什么我在尝试运行我的代码时得到一个TypeError?为什么在PyGame中我得到的是空白的灰色背景而不是动画?为什么我在嵌套的Dict中得到一个键错误?为什么我在Panel中得到一个空的输出对象?为什么我在不同的PC上从Matcher教程得到不同的输出?为什么在我的接收链中我得到的是KFunction1而不是List<E>?为什么我在django中得到"KeyError“异常,而不是在表单验证中得到”此字段是必需的“异常
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解 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表达式来调用,虽然可以做到和直接调用一致性能

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

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

    1K30

    MethodHandle方法句柄使用分享

    ();}}用MethodHandle调用方法流程为:创建MethodType,获取指定方法签名Lookup中查找MethodType方法句柄MethodHandle传入方法参数通过MethodHandle...查找对象工厂方法对应于方法、构造函数和字段所有主要用例。...下面官方API文档对findxxx说明,这些工厂方法和结果方法处理行为之间对应关系: findStatic相当于得到一个static方法句柄,findVirtual找普通方法 findSpecial...对象如果MethodHandle指向实例方法,可以使用MethodHandle对象bindTo()方法将其绑定到目标实例使用MethodHandle对象invoke()、invokeExact...以下一个简单使用ConstantCallSite例子 CallSite实现类简要概述:ConstantCallSite: ConstantCallSite表示一个调用点,该调用点目标方法句柄永远不会改变

    5510

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

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

    1.9K40

    当我们在谈论 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之前一定会写入内存

    4.1K21

    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和自己项目尝试。 敖丙,你知道越多,不知道越多,我们下期见。

    77540

    方法引用(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指向一个总是返回刚刚创建

    91410

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

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

    72530

    disruptor笔记之七:等待策略

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

    68020

    嗨,朋友,你还在用Java 8 吗?Java 23 正式发布了~

    性能改进:Java 23 继续性能上进行优化,包括即时编译器(JIT)提升和更高效类加载机制。尤其对于大规模应用和云环境支持,Java 23 增强了吞吐量和资源利用效率。6....更多封装与模块化:模块化系统得到了进一步改进,增强了对大型项目的支持。Java 23 加强了对访问控制封装,减少了模块之间耦合性,提升了代码健壮性。7....Java 23 为了更好地理解 Java 23 中新特性和改进,以下每个特性与 Java 8 对比。这些对比会帮助大家了解 Java 23 提供改进,并展示为什么它更具优势。..."; System.out.println(message); }}Java 8 字符串拼接冗长,尤其嵌入复杂逻辑时。...无参数类型转换:调用阶段,MethodHandle 可以直接传递强类型参数,减少了 Object 参数拆装箱操作。

    19510
    领券