gpt4 book ai didi

带有子类参数的Java getMethod

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:44 26 4
gpt4 key购买 nike

我正在编写一个使用反射来动态查找和调用方法的库。只给定一个对象、一个方法名称和一个参数列表,我需要调用给定的方法,就好像该方法调用已明确写入代码中一样。

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

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(receiver, "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();
}
}
}

关于带有子类参数的Java getMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com