前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java integer.parseint_java method.invoke

java integer.parseint_java method.invoke

作者头像
全栈程序员站长
发布2022-11-09 19:19:26
4740
发布2022-11-09 19:19:26
举报

大家好,又见面了,我是你们的朋友全栈君。

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

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

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.cn/190230.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月23日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档