2017-08-30 99 views
1

我一直在试图按需加载一些类,这样我可以运行自己的执行方法,因为它是更优化,但它返回一个错误NoSuchMethodFound类加载器返回NoSuchMethodException错误

类试图加载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来源)[18:13:00警告]:在 com.kkosyfarinis.spigot.xssentials.test.CommandHandlerTest.execute(CommandHandlerTest.java:53) [18:13:00警告]:在 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警告]:在 net.minecraft.server.v1_11_R1.DedicatedServer.aM(DedicatedServer.java:437) [18:13:00警告]:在 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:空白 - 对于没有参数的方法,int.class为整数参数之一,服务器,CommandSender(...),但那些都

工作的非

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

+1

我不理解你的代码,但在executeCommand = execute.getClass()getMethod( “执行”,int.class)。不应该是Commandtest.class。或者,也许你应该施放它。 –

回答

1

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

为什么?

发生这种情况的原因是,当您拨打Class.forName时,它将为对象com.kkosyfarinis.spigot.xssentials.test.*返回一个Class实例。之后,您在前一个类实例上调用getClass,此操作返回对象ClassClass实例,之后尝试获取不存在的方法。

要解决此问题,您需要删除多余的电话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}); 
+0

谢谢! :) –

相关问题