java integer.parseint_java method.invoke

java integer.parseint_java method.invoke我正在编写一个使用反射来动态查找和调用方法的库.只给出一个对象,一个方法名和一个参数列表,我需要调用给定的方法,就好像方法调用是在代码中显式编写的一样.我一直在使用以下方法,在大多数情况下都可以使用:staticvoidcallMethod(Objectreceiver,StringmethodName,Object[]params){Class>[]paramTypes…


Jetbrains全系列IDE稳定放心使用

我正在编写一个使用反射来动态查找和调用方法的库.只给出一个对象,一个方法名和一个参数列表,我需要调用给定的方法,就好像方法调用是在代码中显式编写的一样.

我一直在使用以下方法,在大多数情况下都可以使用:

static void callMethod(Object receiver, String methodName, Object[] params) {

Class>[] paramTypes = new Class>[params.length];

for (int i = 0; i < param.length; i++) {

paramTypes[i] = params[i].getClass();

}

receiver.getClass().getMethod(methodName, paramTypes).invoke(receiver, params);

}

但是,当其中一个参数是方法支持的类型之一的子类时,反射API会抛出NoSuchMethodException.例如,如果接收者的类定义了testMethod(Foo),则以下操作失败:

receiver.getClass().getMethod(“testMethod”, FooSubclass.class).invoke(receiver, new FooSubclass());

尽管这有效:

receiver.testMethod(new FooSubclass());

我该如何解决这个问题?如果方法调用是硬编码的,则没有问题 – 编译器只使用重载算法来选择最适用的方法.但它不适用于反射,这是我需要的.

提前致谢!

最佳答案

它比你开始时要长一些,但是这样做你要求的……还有一点 – 例如,callMethod(接收器,“voidMethod”),其中voidMethod不带参数也可以.

static void callMethod(Object receiver,

String methodName, Object… params) {

if (receiver == null || methodName == null) {

return;

}

Class> cls = receiver.getClass();

Method[] methods = cls.getMethods();

Method toInvoke = null;

methodLoop: for (Method method : methods) {

if (!methodName.equals(method.getName())) {

continue;

}

Class>[] paramTypes = method.getParameterTypes();

if (params == null && paramTypes == null) {

toInvoke = method;

break;

} else if (params == null || paramTypes == null

|| paramTypes.length != params.length) {

continue;

}

for (int i = 0; i < params.length; ++i) {

if (!paramTypes[i].isAssignableFrom(params[i].getClass())) {

continue methodLoop;

}

}

toInvoke = method;

}

if (toInvoke != null) {

try {

toInvoke.invoke(receiver, params);

} catch (Exception t) {

t.printStackTrace();

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190230.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析

    缓存穿透,缓存击穿,缓存雪崩解决方案分析前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案

    2022年6月30日
  • hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    hdu 3221 Brute-force Algorithm(高速幂取模,矩阵高速幂求fib)

    2022年1月21日
  • 图形推理1000题pdf_【3分钟模考】图形推理06组「建议收藏」

    图形推理1000题pdf_【3分钟模考】图形推理06组「建议收藏」考点遍历小模考(图形推理005组)平均错误率:36.1%4题对3题达标1.从所给四个选项中,选择最合适的一个,使之呈现一定规律性:2.要求你从四个图形中把与众不同的挑出来。3.4.左边给定的是纸盒的外表面,下面哪一项能由它折叠而成?答案解析第1题【答案】B【解析】本题属于位置类,主要考查数三角形。题干图形中,重叠数三角形个数依次为1、2、3、4、5,应选有6个…

    2022年9月8日
  • MySql基础整理

    http://hovertree.com/menu/mysql/useabccs;select*frommytable2limit3,4;callsp_name1(1,@nn);sel

    2021年12月24日
  • 阿里巴巴Java开发手册(全册四版)

    阿里巴巴Java开发手册(全册四版)阿里官方Java代码规范标准《阿里巴巴Java开发手册2017/2018/2019/2020》小白必备!!!2017年9月25日,阿里巴巴Java开发手册正式发布,至今为止已更迭了四个版本,分别是2017(终极版)、2018(详尽版)、2019(华山版)、2020(泰山版),值得收藏。

    2022年7月7日
  • CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿

    CentOS7 安装以太坊 geth 客户端、创建私有区块链及挖矿安装以太坊源码,即安装GoEthereum(安装Geth)1、安装Golang可以直接使用yum这个包管理器安装Golangyuminstallgolang2、下载以太坊源码(GoEthereum)首先下载geth源码go-ethereum,这里以go-ethereum-1.9.7.tar.gz,直接在GitHub下载3、安装以太坊源码(安装Geth)接下来解压源码:tar-xzfgo-ethereum-1.9.7.tar.gz用下…

    2022年8月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号