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();

}

}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • eureka底层原理「建议收藏」

    eureka底层原理「建议收藏」什么是注册中心全称为:服务注册与发现,rpc远程调用框架核心思想,在于注册中心,使用注册中心管理每个服务与服务之间的依赖关系,这种关系被称为服务治理概念;任何rpc远程调用框架都至少有一个注册中心;服务注册将服务信息注册到注册中心,相当于告诉公司的人,我已经打卡上班了,可以分配工作任务给我了,比如现在我们有一个服务消费者服务A,和两个节点的服务提供者,服务B。服务A和服务B在启动的时候都会向注册中心进行服务注册。服务发现从注册中心获取已注册的服务信息,发现有哪些可以调用的服务可供我使用;相

  • python2 nonlocal_python unboundlocalerror

    python2 nonlocal_python unboundlocalerror在廖雪峰的官网上看到一个很有意思题目。关于闭包的,有兴趣的朋友可以看一下这里,做一下这个题目,当然需要一点闭包的知识。下面我简述一下:利用闭包返回一个计数器函数,每次调用它返回递增整数。#修改下面这个函数defcreateCounter():defcounter():passreturncounter#测试:counterA=createCounter()print(counter…

  • DHCP协议浅析

    DHCP协议浅析定义:动态主机配置协议,主要在一些大型局域网络环境中,集中管理和分配IP地址,提升地址的使用效率。DHCP协议采用CLIENT-SERVER方式实现,而且DHCP协议是基于UDP层之上的应用,DHCPCLIENT将采用端口号68,DHCPSERVER采用端口号67进行交互。DHCP的三种分配IP机制:自动分配方式:DHCP服务器为主机指定一个永久性的IP地址。客户端一旦第一次成功租用IP过后,后面即可永久性使用次IP地址。 动态分配方式:DHCP服务器为主机指定一个具有时间期限的IP地址…

  • 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:riemann_ blog.csdn.net/riemann_/article/details/8783526…

  • python的变量名命名规则_python的变量命名规范

    python的变量名命名规则_python的变量命名规范一.python变量名命名规则:1.变量名通常由字母,数字,下划线组成;2.数字不能作为变量名开头;3.不能以python中的关键字命名;4.变量名要有意义;5.不要用汉字和拼音去命名;6.变量名要区分大小写;7.推荐使用驼峰型(GuessAge或guessAge)和下划线(guess_age)来命名;8.常量通常使用大写来定义.二.注释代码的方法1.单行(当行)注释:用#2.多行注释通过三引号完…

  • python编程的文件后缀是什么_文件没后缀名怎么批量加后缀

    python编程的文件后缀是什么_文件没后缀名怎么批量加后缀python文件后缀名总结:(1).py:这通常是您编写的输入源代码。(2).py3:Python3脚本(Python3脚本通常以.py而不是.py3结尾,很少使用)。(3).pyc:这是编译好的字节码。如果导入一个模块,python将生成一个*.pyc包含字节码的文件,以便再次导入它更容易(也更快)。.pyc二进制文件可以反编译成.py文件,反编译软件叫EasyPythonDecompile…

发表回复

您的电子邮箱地址不会被公开。

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