java integer.parseint_java method.invoke

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【C++学习五】STL库的应用

    【C++学习五】STL库的应用文章目录初识C++之STL标准库1.C++STL的三大核心组件2.自定义函数与算法对容器实现操作3.基于自定义函数以及操作模板实现简易数字图像处理3.1图像灰度变换3.2图像二值化4.初识STL容器之:set集合5.初识STL容器之:map(关联容器)结语初识C++之STL标准库STL是StandardTemplateLibrary的缩写,中文译为“标准模板库”。STL是C++标准库的一部分。我们之前已经基本了解了C++中的模板templet,以及模板的作用。可以说,C

    2022年10月15日
    2
  • MySQL EXPLAIN执行计划详解

    MySQL EXPLAIN执行计划详解详细介绍了MySQLEXPLAIN执行计划的各个字段的含义以及使用方式。

    2022年10月17日
    4
  • source insight4.0注册码_sourceinsight激活成功教程版安装教程

    source insight4.0注册码_sourceinsight激活成功教程版安装教程下载地址:http://www.sourceinsight.com/down35.html注册码:    SI3US-205035-36448    SI3US-466908-65897    SI3US-368932-59383    SI3US-065458-30661    SI3US-759512-70207转自:http://blog.csdn.net/rac

    2022年10月3日
    6
  • macbook air13-inch_苹果笔记本mgn63ch

    macbook air13-inch_苹果笔记本mgn63chMacBookAirMGN63CH/A/MGN93CH/A/MGND3CH/A/MGN73CH/A/MGNA3CH/MGNE3CH/A配置报价图片:https://www.mac.so/macbook-air/MGN63CH/A 7999 深空灰色 全新MacBookAirM1芯片低配 触控ID AppleM1芯片配备8核中央处理器 8GB统一内存 256GB固态硬盘 7核图形处理器 13.3原彩显示2560×160…

    2022年10月6日
    2
  • hive中的数据类型:基本数据类型,集合数据类型_hive数据库类型

    hive中的数据类型:基本数据类型,集合数据类型_hive数据库类型数据类型1.Hive中的数据类型分为两类:基本类型和复杂类型2.基本类型包含:tinyint,smallint,int,bigint,float,double,boolean,string,timestamp,binary3.复杂类型:array,map和structa.array:数组类型,对应了Java中的集合或者数组。原始数据jack,johnlucy,miketom,bob,cindylily,helen,mary,alexfrank,grace,iran,edentony

    2025年12月4日
    2
  • java web 前端开发框架和流程「建议收藏」

    java web 前端开发框架和流程「建议收藏」1 通常JavaWeb开发框架举个例子,对于广告系统的来说,我们先不管一些job,byOminentShopperHelper”style=”color:rgb(59,115,175);border:none!important;display:inline-block!important;float:none!important;font-weight

    2022年7月9日
    28

发表回复

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

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