c invoke 带参数时参数不匹配是怎么回事

6236人阅读
成功经验(57)
大致情况是这样,我在一个DLL定义了一个方法A,A的参数为一个参数数组;
然后使用反射调用其中的方法A,并且传递一个object数组到方法A。
结果出现如下错误:
================================================================================
未处理 System.Reflection.TargetParameterCountException& Message="参数计数不匹配。"& Source="mscorlib"& StackTrace:&&&&&& 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)&&&&&& 在 System.Delegate.DynamicInvokeImpl(Object[] args)
================================================================================
这样如果你直接把接收到的参数数组postedParams直接传递给invoke方法的话,就会产生标题所述的错误;
后来查阅MSDN,这个帖子让我茅塞顿开
应该这样理解:Invoke方法的参数当中有一个自己的object[],正好你传递的参数也是object[],这样的话invoke就会把你参数数组里面的第一个参数作为参数传递给你要调用的方法,于是就报错了。
解决问题的如下:
&&&&&&& /// &summary&&&&&&&& /// 更新接收端&&&&&&& /// &/summary&&&&&&&& private void updateReceive(MyMsgEventArgs e)&&&&&&& {&& //看是否有线程在使用该控件&&&&&&&&&&& if (InvokeRequired)&&&&&&&&&&& {&&&&&&&&&&&&&&& this.rtbReceive.BeginInvoke(new UpdateReceiveEditCallback(updateRtbReceiveConts), new object[] { e });&&&&&&&&&&& }&&&&&&&&&&& else&&&&&&&&&&& {&&&&&&&&&&&&&&& //创建该控件的主线程直接更新&&&&&&&&&&&&&&& updateRtbReceiveConts(e);&&&&&&&&&&& }&&&&&&& }
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:893702次
积分:10983
积分:10983
排名:第1535名
原创:130篇
转载:231篇
评论:153条
(1)(1)(1)(7)(1)(5)(4)(1)(1)(1)(2)(1)(1)(1)(3)(5)(2)(4)(2)(1)(1)(4)(3)(3)(3)(3)(18)(2)(1)(1)(2)(7)(1)(1)(4)(2)(17)(4)(3)(4)(2)(6)(16)(15)(6)(8)(14)(6)(4)(9)(4)(1)(8)(4)(3)(4)(4)(6)(7)(7)(8)(9)(5)(12)(12)(2)(7)(2)(3)(3)(4)(3)(10)(5)(1)(6)(3)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'求助,关于InvocationHandler接口的invoke方法的三个参数问题【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:659,099贴子:
求助,关于InvocationHandler接口的invoke方法的三个参数问题收藏
看AOP实现原理的时候,对java.lang.reflect.InvocationHandler类的invoke(Object proxy,Method method, Object[] args )方法中的参数无法理解,对于第二个参数,我的理解是我们对代理对象调用xxx方法时,系统会调用代理对象的invoke方法,并将xxx方法封装成一个Method对象传给invoke,这样invoke才知道要动态调用哪个方法(也不知道理解的对不对),那其他两个参数是什么意思呢,有什么作用?从哪里来?
2017java学习来上市公司博为峰学java,入学即签就业协议,不就业不收费,查看java课程!java好学吗?java课程来博为峰学,java工程师就业年薪十几万!
没有人么~自学中,求帮助
我擦,顶,求大神现身
好像第一个是代理类,第三个是方法参数
你去看看动态代理
这是一种设计模式
看完动态代理才好理解aop
看看api文档吧,它是解释了每个参数的含义的
proxy - the proxy instance that the method was invoked on这是传入的代理对象,实际想调用的方法会封装给它(如果我没记错的话,工作几周了,根本没用过,所以可能有错,下同)
args - an array of objects containing the values of the arguments passed in the method invocation on the proxy instance, or null if interface method takes no arguments. Arguments of primitive types are wrapped in instances of the appropriate primitive wrapper class, such as java.lang.Integer or java.lang.Boolean.这个就是用来传method对象的参数的,如果没有就传null
登录百度帐号推荐应用探秘Java 7:JVM动态语言支持详解
 作者: 司马牵牛 编译 编辑:
  新的 invokedynamic 指令  新的 invokedynamic 字节码指令的语法与 invokeinterface 指令类似:  invokedynamic & method-specification& & n&&&  但,它的 & method-specification& 只需指定方法名称,对描述符的唯一要求是它应引用非空对象。  invokeinterface 字节码指令差不多是这样的:  invokedynamic #<span style="color: #;  //DynamicMethod java/lang/Object.lessThan:(Ljava/lang/O)&  重要的是,invokedynamic 字节码指令运行动态语言的实现器(implementer)将方法调用编译为字节码,而不必指定目标的类型,该目标包含了方法、调用的返回类型或方法参数类型。这些类型对于执行指令的 JVM 不必是已知的。但如果未提供接收器的类型,JVM 如何找到该方法?毕竟,JVM 需要连接并调用真实类型上的真实方法。答案在于,JSR 292 还包含了一个新的动态类型语言的连接机制。JVM 使用新的连接机制获取所需的方法。  新的动态连接机制:方法句柄(method handle)  JDK 7 包含了新包,java.dyn,其中包含了与在 Java 平台中动态语言支持相关的类。其中一个类为 MethodHandle.方法句柄是类型 java.dyn.MethodHandle 的一个简单对象,该对象包含一个 JVM 方法的匿名引用。  新连接机制还包含一个引导方法(bootstrap 方法),它是一个方法句柄,决定了调用现场(call site)调用的目标方法。调用现场是调用指令的实例,在本节中,它就是 invokedynamic 字节码指令的实例。包含 invokedynamic 指令的每个类都必须指定引导方法。  JVM 第一次遇到具有接收器和参数的 invokedynamic 字节码时,它调用引导方法。调用语言支持的方法,可以使用术语 up-call 来描述。  引导方法反过来选择相应的目标方法句柄。然后 JVM 将该方法句柄引用的方法与 invokedynamic 字节码关联起来。JVM 下次遇到具有相同接收器和参数的 invokedynamic 字节码时,它将立即调用之前所选的方法。  方法句柄相当简单,仅包含一个描述特定类型的类型令牌(type toke)。此外,方法句柄隐式地包含一个与其关联的 invoke 方法。要调用方法句柄,你需要调用它的 invoke 方法,与调用对象方法类似,即 MethodHandle.invoke(&&)。由于每个方法句柄都具有其自身的类型,因此,它只接受那个类型的 invoke 调用。如果调用的类型与方法句柄的类型不匹配,方法句柄将返回异常。 总之,方法句柄提供了一种连接机制,它能够让 JVM 根据 invokedynamic 字节码指令调用正确的方法。但 JVM 遇到 invokedynamic 字节码时,它将使用方法句柄获得所需的方法。请注意,相对于映射调用,方法句柄提供了一种更好的方式,来满足方法调用的字节码要求。相较而言,方法句柄提供了一种命名和连接方法的方式,而无需考虑方法类型或位置,而且这种方式具有完善的类型安全和本地的执行速度。  通过接口注入(interface injection)在运行时修改类  接口注入能够在运行时修改类,这样类就可以构建新的接口。对于动态类型语言,尤其是基本语言,这是一个常见的功能。但它不属于 JVM 标准的一部分。该功能还处于调研阶段,以便加入 JSR 292 中。  在 JVM 中支持接口注入,运行时语言将可以推荐新的功能,以模块化的方式供其自身使用。例如,假设 JVM 在运行的语言的类或类集合需要串行化的类型,而它尚未在该语言实现。运行时该语言可以定义一个串行定义为可注入的接口。它还可以定义一个注入方法。该方法定义该语言将为哪个类指定新的串行能力。对相关对象调用该注入方法,就可以完成注入。利用接口注入,可以使 JVM 中的动态类型语言很方便地与 JVM 中其他语言进行整合。  总 结  多年来,在 JVM 上运行的语言越来越多。在 JVM 中支持动态类型语言,对于使用动态语言的开发者非常具有吸引力。因为,动态类型让开发者更具灵活性,而且 JVM 具有更好的执行效率。但是,对于动态类型语言,满足方法调用的字节码的要求非常困难。为了应对这一难题,JSR 292 提供了新的字节码 invokedynamic 以及新的基于方法句柄的连接机制。此外,目前还在进行调研在 JSR 292 中引入接口注入,它能够在运行修改类,从而可以实现新的接口。
第1页:第2页:
大学生分期购物销量榜
已有条评论
IT168企业级安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&查看: 4741|回复: 2|关注: 0
MATLAB报错xlswrite at 213 Invoke Error, Dispatch Exception: 类型不匹配。
<h1 style="color:# 麦片财富积分
新手, 积分 6, 距离下一级还需 44 积分
load train_ihist.mat
xlswrite('train1.xlsx',train);
train_ihist.mat的内容是
的矩阵,矩阵的内容见附件,好像我的矩阵是21兆的,好像附件上传不了,不知道怎么上传
一直抱错, Error using ==& xlswrite at 213Invoke Error, Dispatch Exception: 类型不匹配。
<h1 style="color:# 麦片财富积分
关注者: 4
估计装了wps,或者office没装,把wps卸掉装上office就可以了
<h1 style="color:# 麦片财富积分
我是安装的office,没有安装WPS,结果还是出现这个错误,不知道怎么办了
站长推荐 /2
机器视觉和人工智能在医疗设备中的应用及实现
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区

我要回帖

更多关于 unity invoke 参数 的文章

 

随机推荐