首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MethodHandle示例在invokeExact调用时抛出WrongMethodTypeException

MethodHandle示例在invokeExact调用时抛出WrongMethodTypeException
EN

Stack Overflow用户
提问于 2012-01-10 20:15:07
回答 2查看 1.9K关注 0票数 5

MethodHandle类的描述中所示的示例在调用语句mh.invokeExact("daddy",'d','n')时抛出一个WrongMethodTypeException,其中包含以下描述:(CC)Ljava/lang/String; cannot be called with a different arity as ([Ljava/lang/Object;)Ljava/lang/Object;

MethodHandle对象mh有一个对应于:(CC)Ljava/lang/String的符号类型描述符。但是当我们调用mh.invokeExact("daddy",'d','n')时,参数:dn被作为Object数组传递,然后它们与char类型的参数不匹配。

我知道我可以使用invokeWithArguments而不是invokeExcatinvoke来解决上面的问题,但是这个示例应该按照Java7API的MethodHandle描述中所描述的那样工作。除此之外,与invoke/invokeExact相比,invokeWithArguments有一个性能开销。

EN

回答 2

Stack Overflow用户

发布于 2012-01-11 04:07:31

你是如何编译这篇文章的?

对我来说,这听起来像是一个已知的Eclipse bug。

我刚刚检查了javac和下面的代码:

代码语言:javascript
复制
import java.lang.invoke.*;

public class ScratchMH {    
        private static ScratchMH instance = null;

        public ScratchMH() {
                super();
        }

        private void run() throws Throwable {
                Object x, y; String s; int i;
                MethodType mt; MethodHandle mh;
                MethodHandles.Lookup lookup = MethodHandles.lookup();

                // mt is (char,char)String
                mt = MethodType.methodType(String.class, char.class, char.class);
                mh = lookup.findVirtual(String.class, "replace", mt);
                s = (String) mh.invokeExact("daddy",'d','n');
                // invokeExact(Ljava/lang/String;CC)Ljava/lang/String;

                System.out.println(s);
        }

        public static void main(String[] args) throws Throwable {
                instance = new ScratchMH();
                instance.run();
        }
}

看起来工作正常:

代码语言:javascript
复制
ariel-2:src boxcat$ javac scratch/clj/ScratchMH.java 
ariel-2:src boxcat$ java scratch/clj/ScratchMH
nanny
ariel-2:src boxcat$ 

javap输出的相关部分看起来也很正常:

代码语言:javascript
复制
  35: invokevirtual #8                  // Method java/lang/invoke/MethodHandles$Lookup.findVirtual:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;
  38: astore        6
  40: aload         6
  42: ldc           #9                  // String daddy
  44: bipush        100
  46: bipush        110
  48: invokevirtual #10                 // Method java/lang/invoke/MethodHandle.invokeExact:(Ljava/lang/String;CC)Ljava/lang/String;
  51: astore_3      
票数 2
EN

Stack Overflow用户

发布于 2016-08-11 08:48:47

invokeExact要求MH的方法类型描述和参数类型完全匹配。因为MH的方法类型是(cc)string,所以您希望执行MH的是char,所以第一个和第二个参数都应该是char。所以它就是这样的。

代码语言:javascript
复制
``String s = (String)mh.invokeExact('a', 'b')``
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8803115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档