gpt4 book ai didi

java - 方法存在时抛出 NoSuchMethodException

转载 作者:行者123 更新时间:2023-12-01 11:27:00 27 4
gpt4 key购买 nike

我正在尝试根据类和参数创建类的实例。用于创建此类的方法如下所示:

@SuppressWarnings("unchecked")
public Plugin instantiatePlugin(Class clazz, Object... params) {
try {
Class plugin = pluginClasses.get(clazz);
if (params.length > 0) {
Class[] parameterTypes = new Class[params.length];
for (int i = 0; i < parameterTypes.length; i++) {
parameterTypes[i] = params[i].getClass();
}
return (Plugin)plugin.getDeclaredConstructor(parameterTypes).newInstance(params);
} else {
return (Plugin)plugin.newInstance();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

我收到的错误如下:

java.lang.NoSuchMethodException: plugin.movement.WalkRunPlugin.(com.rr.server.entity.mob.player.Player)

当尝试调用已声明的构造函数时。这是我传递给该方法的内容:instantiatePlugin(MovementPlugin.class, this);

其中 thisPlayer 类的实例,它扩展了 Mob

这是我的 WalkRunPlugin 示例中的唯一构造函数:

public WalkRunPlugin(Mob mob) {
this.mob = mob;
}

考虑到 Mob 是抽象的,而 Player 扩展了 mob,Player 是一个 Mob,所以我认为这没有理由不起作用。

这似乎是因为反射方法期望的是 Player 的类型而不是 Mob 的类型,但是 Player 并不是唯一的 Mob。所以我需要找到一种方法在这个方法中接受父类(super class)的子类。尖端?

可编译示例:

public class Example {

public static void main(String[] args) {
new Example();
}

private Example() {
try {
Class clazz = Plugin.class;
clazz.getDeclaredConstructor(Player.class).newInstance(new Player());
} catch (Exception e) {
e.printStackTrace();
}
}

public static abstract class Mob {

}

public static class Player extends Mob {

}

public static class Plugin {
Mob m;

Plugin(Mob m) {
this.m = m;
}
}
}

最佳答案

getConstructor method不会找到构造函数,因为它只会找到参数类型的精确匹配。

The constructor to reflect is the public constructor of the class represented by this Class object whose formal parameter types match those specified by parameterTypes.

它不会像编译器那样工作,编译器会考虑 Player 可能的扩大引用转换。至Mob匹配构造函数。

您需要找到正确的Constructor 。这是我能想到的最好的方法:

循环遍历所有Constructor s 由 getConstructors 返回。确定所有参数类型是否与您拥有的参数类型匹配,或者它们是否是您拥有的所有参数类型的父类(super class)。您可以访问 Constructor 的参数类型与 getParameterTypes()方法,它将访问 Class与参数类型关联的对象。然后你可以使用isInstance(params[i]) (或isAssignableFrom(params[i].getClass()))。如果所有参数都匹配,则使用 Constructor .

这显然会变得困惑且非常复杂,因为您正在执行编译器通常所做的工作 - 确定要调用的正确构造函数 - 但为了这个确切的目的,上述解决方案之一应该足够了。您应该能够找到 Constructor这需要 Mob ,即使您获得 Player例如,按照上面的方式。

关于java - 方法存在时抛出 NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30740952/

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