类加载器返回NoSuchMethodException错误

时间:2017-08-30 16:08:05

标签: java class loader bukkit

我一直在尝试按需加载一些类,以便我可以运行他们的执行方法,因为它更优化但是它返回NoSuchMethodFound错误

尝试加载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");
    }

}

然后它返回

  

[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警告]:at   com.kkosyfarinis.spigot.xssentials.Xssentials.onCommand(Xssentials.java:137)   [18:13:00警告]:at   org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)   [18:13:00警告]:at   org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)   [18:13:00警告]:at   org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchCommand(CraftServer.java:650)   [18:13:00警告]:at   org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchServerCommand(CraftServer.java:636)   [18:13:00警告]:at   net.minecraft.server.v1_11_R1.DedicatedServer.aM(DedicatedServer.java:437)   [18:13:00警告]:at   net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:400)   [18:13:00警告]:at   net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678)   [18:13:00警告]:at   net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576)   [18:13:00 WARN]:在java.lang.Thread.run(未知来源)

我确实尝试使用paramTypes:-empty-用于无参数方法,int.class用于整数参数1,服务器,CommandSender(...)但不用于那些工作

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

您正尝试在execute对象上获取名为Class的方法。

为什么?

这是因为当您致电Class.forName时,它会返回对象Class的{​​{1}}个实例。之后,在前一个类实例上调用com.kkosyfarinis.spigot.xssentials.test.*,在您尝试获取非现有方法之后,将返回对象getClass的{​​{1}}实例。

要解决此问题,您需要删除对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