2013-08-05 4 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); 
} 

из документов API getConstructor (выделение мое):

Возвращает объект Конструктора, который отражает указанный общественного конструктора класса, представленный этот объект класса.

Либо сделать конструктор общественности или использовать getDeclaredConstructor() и установить затем сделать setAccesible(true)

+1

Ой, не понял, что мне пришлось публиковать все подклассы –

Смежные вопросы