2013-08-05 11 views
5

Sto tentando di utilizzare le riflessioni per caricare un'istanza di una classe. Non riesco a ottenere un'eccezione del metodo quando provo a farlo. Ho controllato, controllato e ricontrollato. Quel costruttore esiste chiaramente. Qualcuno ha qualche idea? Ho usato con successo questo prima su un altro progetto con codice essenzialmente identico, quindi non sono sicuro di dove ho sbagliato. Fonte può essere trovato qui:Java NoSuchMethodException quando si ottiene il costruttore

private void loadCommands() { 
     try { 
      for (Class<?> clazz : ReflectionsReplacement.getSubtypesOf(BaseCommand.class, "us.zsugano.itemsave.commands", plugin.getClass().getClassLoader(), BaseCommand.class)) { 

       BaseCommand baseCommand = null; 
       try { 
        baseCommand = (BaseCommand) clazz.getConstructor(ItemSave.class).newInstance(plugin); 

        if(Listener.class.isAssignableFrom(clazz)) { 
         plugin.getServer().getPluginManager().registerEvents((Listener) baseCommand, plugin); 
        } 

       } catch (Exception e) { 
        plugin.PluginPM.sendMessage(Level.SEVERE, "Issues encountered when trying to load commands."); 
        e.printStackTrace(); 
       } 
       commands.add(baseCommand); 
      } 
     } catch (Exception e) { 
      plugin.PluginPM.sendMessage(Level.SEVERE, "Exception caught while loading commands."); 
      e.printStackTrace(); 
     } 

     for (BaseCommand command : commands) { 
      plugin.getCommand(command.getName().toLowerCase()).setExecutor(this); 
     } 

} 

public abstract class BaseCommand { 

    public ItemSave plugin; 

    public BaseCommand(ItemSave plugin) { 
     this.plugin = plugin; 
} 

sorgente completa: https://github.com/zachoooo/ItemSave

Ed ecco lo Stack Trace:

19:43:10 [SEVERE] [ItemSave] Issues encountered when trying to load commands. 
19:43:10 [SEVERE] java.lang.NoSuchMethodException: us.zsugano.itemsave.commands. 
StoreCommand.<init>(us.zsugano.itemsave.ItemSave) 
19:43:10 [SEVERE]  at java.lang.Class.getConstructor0(Unknown Source) 
19:43:10 [SEVERE]  at java.lang.Class.getConstructor(Unknown Source) 
19:43:10 [SEVERE]  at us.zsugano.itemsave.commands.CommandManager.loadComma 
nds(CommandManager.java:32) 
19:43:10 [SEVERE]  at us.zsugano.itemsave.commands.CommandManager.<init>(Co 
mmandManager.java:23) 
19:43:10 [SEVERE]  at us.zsugano.itemsave.ItemSave.onEnable(ItemSave.java:1 
9) 
19:43:10 [SEVERE]  at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlug 
in.java:217) 
19:43:10 [SEVERE]  at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(
JavaPluginLoader.java:457) 
19:43:10 [SEVERE]  at org.bukkit.plugin.SimplePluginManager.enablePlugin(Si 
mplePluginManager.java:381) 
19:43:10 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R2.CraftServer.loadPlugin 
(CraftServer.java:282) 
19:43:10 [SEVERE]  at org.bukkit.craftbukkit.v1_6_R2.CraftServer.enablePlug 
ins(CraftServer.java:264) 
19:43:10 [SEVERE]  at net.minecraft.server.v1_6_R2.MinecraftServer.l(Minecr 
aftServer.java:313) 
19:43:10 [SEVERE]  at net.minecraft.server.v1_6_R2.MinecraftServer.f(Minecr 
aftServer.java:290) 
19:43:10 [SEVERE]  at net.minecraft.server.v1_6_R2.MinecraftServer.a(Minecr 
aftServer.java:250) 
19:43:10 [SEVERE]  at net.minecraft.server.v1_6_R2.DedicatedServer.init(Ded 
icatedServer.java:151) 
19:43:10 [SEVERE]  at net.minecraft.server.v1_6_R2.MinecraftServer.run(Mine 
craftServer.java:391) 
19:43:10 [SEVERE]  at net.minecraft.server.v1_6_R2.ThreadServerApplication. 
run(SourceFile:582) 
+0

idea Proprio selvaggio, ma forse provare 'getDeclaredConstructor' invece di' getConstructor' nel caso in cui il costruttore non è pubblico. Inoltre non dovresti collegare il codice sorgente ma aggiungerlo alla domanda. – Pshemo

+0

È decisamente pubblico e non volevo dover includere la fonte per un paio di file sulla pagina, il che renderebbe la mia domanda piuttosto lunga. Dovrei farlo comunque? –

+1

No, dovresti ridurlo a un programma completo contenente solo poche righe di codice che riproducono il problema. – Dukeling

risposta

10

In StoreCommand.java vedo questo pacchetto costruttore privato:

StoreCommand(ItemSave plugin) { 
    super(plugin); 
} 

dai documenti API di getConstructor (enfasi mia):

Restituisce un oggetto costruttore che riflette l'specificato pubblico costruttore della classe rappresentata da questo oggetto Class.

Se prendete un pubblico costruttore oppure utilizzare getDeclaredConstructor() e impostare poi fare setAccesible(true)

+1

Oh, non mi sono reso conto che dovevo rendere pubbliche tutte le sottoclassi –

Problemi correlati