2013-08-05 28 views
5

我想使用反射來加載一個類的實例。當我嘗試做這件事時,我得到了一個沒有這樣的方法異常。我已檢查並檢查並重新檢查。這個構造器顯然確實存在。有沒有人有任何想法?我已經成功地在另一個基本上相同的代碼項目中使用過這個,所以我不知道我搞砸了哪裏。來源可以在這裏找到:Java NoSuchMethodException獲取構造函數

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

全部來源:https://github.com/zachoooo/ItemSave

這裏是堆棧跟蹤:

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

就大膽的想法,但也許嘗試'getDeclaredConstructor',而不是'getConstructor'的情況下,構造函數是不公開的。你也不應該鏈接源代碼,但將其添加到問題。 – Pshemo

+0

這絕對是公開的,我不想在頁面上包含幾個文件的源代碼,這會讓我的問題相當長。我應該這樣做嗎? –

+1

不,你應該把它修剪成一個完整的程序,其中只有幾行代碼可以重現問題。 – Dukeling

回答

10

在StoreCommand.java我看到這個包私有構造:

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

來自getConstructor的API文檔(重點是我的):

返回反映指定公共 構造此Class對象所表示的類的構造器對象。

要麼使構造公開或使用getDeclaredConstructor()並設置然後做setAccesible(true)

+1

哦,沒有意識到我必須公開所有的小類 –