java - 类加载器返回 NoSuchMethodException 错误

标签 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 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(...),但这些都不起作用

关于如何解决这个问题有什么想法吗?

最佳答案

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

为什么?

发生这种情况是因为当您调用Class.forName时它返回 Class对象的实例 com.kkosyfarinis.spigot.xssentials.test.* 。之后您调用getClass在前一个类实例上,这将返回 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还有一个有用的newInstance您可以用来创建新实例的方法。

可以这样使用:

Object instance = clazz.newInstance();
executeCommand.invoke(instance, new Object[]{2147483647});

关于java - 类加载器返回 NoSuchMethodException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965138/

相关文章:

java - 使用java查找html页面内容中元素的xpath

java - Shiro 与 SpringSecurity

java - 在 Java 中,如果子类具有不同的类型,我可以以某种方式将字段移动到父类(super class)吗?

c++ - 使用命名空间而不是单例

compiler-construction - 链接器和加载器引用

java - 使用标志 Intent.FLAG_ACTIVITY_NEW_TASK 从 onPostExecute() 方法启动 Intent 不起作用

c++ - 虽然循环比我指定的要循环更多次

java - 我的 Web 应用程序在 IDE 中测试时运行良好,但在 Web 服务器 (tomcat) 上无法运行

javascript - yepnope js 测试对象如何工作?

drupal - 如何更改Drupal的ajax gif加载器