2017-08-30 1 views
1

Ich habe versucht, einige Klassen bei Bedarf zu laden, so dass ich Methoden, um ihre ausführen ausführen können, da es mehr optimiert ist, aber es gibt einen NoSuchMethodFound FehlerClass-Loader liefern einen NoSuchMethodException Fehler

Klasse versucht Commandtest

zu laden
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"); 
    } 

} 

Und es gibt diese

[18.13.00 Warnen]: java.lang.NoSuchMethodException: java.lang.Class.execute (int) [18.13.00 Warnen]: bei java.lang.Class.getMethod (Unbekannt Quelle) [18:13:00 WARN]: um com.kkosyfarinis.spigot.xssentials.test.CommandHandlerTest.execute (CommandHandlerTest.java:53) [18:13:00 WARN]: um com.kkosyfarinis.spigot .xssentials.Xssentials.onCommand (Xssentials.java:137) [18:13:00 WARN]: um org.bukkit.command.PluginCommand.execute (PluginCommand.java:44) [18:13:00 WARN] : um org.bukkit.command.SimpleCommandMap.dispatch (SimpleCommandMap.java:141) [18:13:00 WARN]: um org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchCommand (CraftServer.java:650) [18.13.00 Warnen]: bei org.bukkit.craftbukkit.v1_11_R1.CraftServer.dispatchServerCommand (CraftServer.java:636) [18:13:00 WARN]: um net.minecraft.server.v1_11_R1.DedicatedServer.aM (DedicatedServer.java:437) [18:13:00 WARN]: um net.minecraft.server.v1_11_R1.DedicatedServer .D (DedicatedServer.java:400) [18:13:00 WARN]: um net.minecraft.server.v1_11_R1.MinecraftServer.C (MinecraftServer.java:678) [18:13:00 WARN]: um net.minecraft.server.v1_11_R1.MinecraftServer.run (MinecraftServer.java:576) [18:13:00 WARN]: bei java.lang.Thread.run (unbekannte Quelle)

Ich habe versucht, wie die paramTypes mit: -leer- für das kein Argument Methode, int.class für das Integer-Argument ein, und den Server, CommandSender (...), aber nicht von denen bei allen

gearbeitet

Irgendwelche Ideen, wie Sie das beheben können?

+1

ich Ihren Code verstehen tat nicht, aber in executeCommand = execute.getClass() getMethod ("Ausführen", int.class);. sollte Commandtest.class nicht sein. Oder vielleicht sollten Sie es umsetzen. –

Antwort

1

Sie versuchen, eine Methode mit dem Namen execute auf einem Class Objekt zu erhalten.

Warum?

Dies passiert, weil beim Aufruf Class.forName eine Class Instanz für das Objekt com.kkosyfarinis.spigot.xssentials.test.* zurückgegeben wird. Nachdem Sie auf der vorherigen Klasseninstanz getClass aufgerufen haben, wird eine Class Instanz für das Objekt Class zurückgegeben, nach dem Sie versuchen, eine nicht vorhandene Methode zu erhalten.

Um dies zu beheben, müssen Sie den überflüssigen Anruf zu getClass entfernen, damit es richtig funktioniert.

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); 

Dann müssen Sie auch invoke rufen schließlich die Methode aufzurufen.Vorsicht ist geboten, da Ihre Methode nicht statisch ist, dh Sie müssen auch eine Instanz der Klasse übergeben, für die Sie die Methode ausführen wollen.

Das ist wirklich einfach, denn Class hat auch eine nützliche newInstance Methode, die Sie verwenden können, um eine neue Instanz zu erstellen.

Dies kann wie folgt verwendet werden:

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

Danke dafür! :) –

Verwandte Themen