2013-08-05 14 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

そして、ここでは、スタックトレースです:StoreCommand.javaで

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

だけで野生のアイデアを行い、その後設定し、多分ケースコンストラクタでgetConstructor'が公開されていない代わりに、 'の' getDeclaredConstructor'てみます。また、ソースコードをリンクするのではなく、質問に追加するべきです。 – Pshemo

+0

これは間違いなく公開されており、ページにいくつかのファイルのソースを含める必要はないので、時間がかかります。私はそれをとにかくすべきか? –

+1

いいえ、問題を再現する数行のコードしか含まれていない完全なプログラムにトリムする必要があります。 – Dukeling

答えて

10

私は、このパッケージプライベートコンストラクタを参照してください。

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

getConstructor(emphasis mine)のAPIドキュメントから:

このClassオブジェクトが表すクラスの指定 publicコンストラクタをリフレクトするConstructorオブジェクトを返します。

コンストラクタを公開するかgetDeclaredConstructor()を使用してsetAccesible(true)

+1

ああ、私もすべてのサブクラスをpublicにしなければならないことに気付かなかった –

関連する問題