gpt4 book ai didi

java - getMethod 抛出方法未找到异常

转载 作者:行者123 更新时间:2023-11-30 03:19:10 26 4
gpt4 key购买 nike

我正在使用 getMethod(String name, Class[] types) 方法来获取方法,但当有 int 参数时,我得到一个未找到的方法。我想我明白了,因为在我的 Class 数组中我有 java.lang.Integer 类(包装器)而不是 int 。我通过使用通用 Object.getClass() 获得该类,所以我认为我不能轻易更改它。这是执行此操作的代码部分:

for (int i = 0; i < parameterTypes.length; i++) {
parameterTypes[i] = arguments[i].getClass();
}

try {
Method mmethod = mclass.getMethod(contractName, parameterTypes);
} catch (NoSuchMethodException e) {}

我能以某种方式解决这个问题吗?

最佳答案

假设你有这个类(class)

class ReflectTest {
Object o = null;
public void setO(int i) {
System.out.println("set int");
o = i;
}
public void setO(Integer i) {
System.out.println("set Integer");
o = i;
}
}

setO(int i)setO(Integer i)是两种不同的方法,因此您的类中不能只有其中一种并依赖自动装箱通过 Class#getMethod(Class<?>...) 获取方法对象并传递一种或另一种参数类型。

@Test
public void invoke() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Method method = ReflectTest.class.getMethod("setO", int.class);
method.invoke(new ReflectTest(), 3);
method.invoke(new ReflectTest(), Integer.valueOf(3));

method = ReflectTest.class.getMethod("setO", Integer.class);
method.invoke(new ReflectTest(), 3);
method.invoke(new ReflectTest(), Integer.valueOf(3));
}

都会打印

set int
set int

set Integer
set Integer

这里自动装箱适用于调用。

但是在您的情况下,您从存储为 Object 的值中提取参数的类型。 。在这种情况下,原始类型会自动装箱到各自的包装类型中,因此您找不到与 int.class 对应的方法。作为参数。

@Test
public void invoke() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
invoke(new ReflectTest(), "setO", 3);
invoke(new ReflectTest(), "setO", Integer.valueOf(3));
}

private void invoke(Object instance, String methodeName, Object argValue) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
System.out.println(argValue.getClass().isPrimitive());
Method method = ReflectTest.class.getMethod("setO", argValue.getClass());
method.invoke(new ReflectTest(), argValue);
method.invoke(new ReflectTest(), Integer.valueOf(3));
}

这里的输出是:

false
set Integer
false
set Integer

如您所见,没有基元,只有 Integer.class 的方法被找到并调用。如果删除它,您将得到 NoSuchMethodException .

因此,为了解决您的问题,请更改您尝试通过反射调用的方法以采用包装器类型,或者更好的是,传递正确的参数类型,而不是从某些值派生它们。

最后,NoSuchMethodException当该方法不可访问时也会抛出,即不可访问 public ,确保该方法是公共(public)的。

关于java - getMethod 抛出方法未找到异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31761595/

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