Class 加载程序 returns NoSuchMethodException 错误
Class loader returns a NoSuchMethodException error
我一直在尝试按需加载一些 类 以便我可以 运行 他们的执行方法,因为它更优化了但是它 returns 一个 NoSuchMethodFound 错误
Class 正在尝试加载 Commandtest
Object execute = Class.forName("com.kkosyfarinis.spigot.xssentials.test." + _className);
Class<?>[] paramTypes = {Server.class, CommandSender.class, String.class, String[].class};
executeCommand = execute.getClass().getMethod("execute", int.class);
//
//For the server, commandsender(...)
//executeCommand.invoke(server, sender, label, args);
//
//for int
//executeCommand.invoke(5);
//
//for empty
//executeCommand.invoke();
Commandtest.java
package com.kkosyfarinis.spigot.xssentials.test;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
public class Commandtest extends CommandHandlerTest{
protected Commandtest() {
super("test");
}
public void execute(Server server, CommandSender sender, String label, String args)
{
System.out.println("this is a test");
}
protected void execute(int test)
{
System.out.println(test);
}
protected void execute()
{
System.out.println("this is a test");
}
}
它returns这个
[18:13:00 WARN]: java.lang.NoSuchMethodException:
java.lang.Class.execute(int) [18:13:00 WARN]: at
java.lang.Class.getMethod(Unknown Source) [18:13:00 WARN]: at
com.kkosyfarinis.spigot.xssentials.test.CommandHandlerTest.execute(CommandHandlerTest.java:53)
[18:13:00 WARN]: at
com.kkosyfarinis.spigot.xssentials.Xssentials.onCommand(Xssentials.java:137)
[18:13:00 WARN]: at
org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[18:13:00 WARN]: at
org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[18:13:00 WARN]: at
org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchCommand(CraftServer.java:650)
[18:13:00 WARN]: at
org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchServerCommand(CraftServer.java:636)
[18:13:00 WARN]: at
net.minecraft.server.v1_11_R1.DedicatedServer.aM(DedicatedServer.java:437)
[18:13:00 WARN]: at
net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:400)
[18:13:00 WARN]: at
net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678)
[18:13:00 WARN]: at
net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576)
[18:13:00 WARN]: at java.lang.Thread.run(Unknown Source)
我确实尝试使用 paramTypes:-empty- 用于无参数方法,int.class 用于整数参数一,以及服务器 CommandSender(...) 但这些都不起作用
关于如何解决这个问题有什么想法吗?
您正在尝试在 Class
对象上获取名为 execute
的方法。
为什么?
发生这种情况是因为当您调用 Class.forName
时,它 returns 对象 com.kkosyfarinis.spigot.xssentials.test.*
的 Class
实例。之后你在前一个 class 实例上调用 getClass
,这个 returns 一个对象 Class
的 Class
实例,在你尝试获得一个不存在的实例之后方法。
要解决此问题,您需要删除对 getClass
的多余调用,以使其正常工作。
Class<?> execute = Class.forName("com.kkosyfarinis.spigot.xssentials.test." + _className);
// Class<?>[] paramTypes = {Server.class, CommandSender.class, String.class, String[].class};
executeCommand = execute.getMethod("execute", int.class);
然后你还需要调用invoke
来最终调用该方法。这里应该小心,因为你的方法不是静态的,这意味着你还需要传递一个 class 的实例,你想在上面执行该方法。
这真的很简单,因为 Class
还有一个有用的 newInstance
方法,您可以使用它来创建新实例。
可以这样使用:
Object instance = clazz.newInstance();
executeCommand.invoke(instance, new Object[]{2147483647});
我一直在尝试按需加载一些 类 以便我可以 运行 他们的执行方法,因为它更优化了但是它 returns 一个 NoSuchMethodFound 错误
Class 正在尝试加载 Commandtest
Object execute = Class.forName("com.kkosyfarinis.spigot.xssentials.test." + _className);
Class<?>[] paramTypes = {Server.class, CommandSender.class, String.class, String[].class};
executeCommand = execute.getClass().getMethod("execute", int.class);
//
//For the server, commandsender(...)
//executeCommand.invoke(server, sender, label, args);
//
//for int
//executeCommand.invoke(5);
//
//for empty
//executeCommand.invoke();
Commandtest.java
package com.kkosyfarinis.spigot.xssentials.test;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
public class Commandtest extends CommandHandlerTest{
protected Commandtest() {
super("test");
}
public void execute(Server server, CommandSender sender, String label, String args)
{
System.out.println("this is a test");
}
protected void execute(int test)
{
System.out.println(test);
}
protected void execute()
{
System.out.println("this is a test");
}
}
它returns这个
[18:13:00 WARN]: java.lang.NoSuchMethodException: java.lang.Class.execute(int) [18:13:00 WARN]: at java.lang.Class.getMethod(Unknown Source) [18:13:00 WARN]: at com.kkosyfarinis.spigot.xssentials.test.CommandHandlerTest.execute(CommandHandlerTest.java:53) [18:13:00 WARN]: at com.kkosyfarinis.spigot.xssentials.Xssentials.onCommand(Xssentials.java:137) [18:13:00 WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) [18:13:00 WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [18:13:00 WARN]: at org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchCommand(CraftServer.java:650) [18:13:00 WARN]: at org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchServerCommand(CraftServer.java:636) [18:13:00 WARN]: at net.minecraft.server.v1_11_R1.DedicatedServer.aM(DedicatedServer.java:437) [18:13:00 WARN]: at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:400) [18:13:00 WARN]: at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678) [18:13:00 WARN]: at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576) [18:13:00 WARN]: at java.lang.Thread.run(Unknown Source)
我确实尝试使用 paramTypes:-empty- 用于无参数方法,int.class 用于整数参数一,以及服务器 CommandSender(...) 但这些都不起作用
关于如何解决这个问题有什么想法吗?
您正在尝试在 Class
对象上获取名为 execute
的方法。
为什么?
发生这种情况是因为当您调用 Class.forName
时,它 returns 对象 com.kkosyfarinis.spigot.xssentials.test.*
的 Class
实例。之后你在前一个 class 实例上调用 getClass
,这个 returns 一个对象 Class
的 Class
实例,在你尝试获得一个不存在的实例之后方法。
要解决此问题,您需要删除对 getClass
的多余调用,以使其正常工作。
Class<?> execute = Class.forName("com.kkosyfarinis.spigot.xssentials.test." + _className);
// Class<?>[] paramTypes = {Server.class, CommandSender.class, String.class, String[].class};
executeCommand = execute.getMethod("execute", int.class);
然后你还需要调用invoke
来最终调用该方法。这里应该小心,因为你的方法不是静态的,这意味着你还需要传递一个 class 的实例,你想在上面执行该方法。
这真的很简单,因为 Class
还有一个有用的 newInstance
方法,您可以使用它来创建新实例。
可以这样使用:
Object instance = clazz.newInstance();
executeCommand.invoke(instance, new Object[]{2147483647});