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

을 그리고 여기에 스택 추적입니다 : 소스는 여기에서 찾을 수 있습니다

내가이 패키지 개인 생성자를 참조 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의 API 문서 (강조 광산) :

이 Class 객체가 나타내는 클래스의 지정된 공공 생성자를 반영하는 Constructor 오브젝트를 돌려줍니다.

생성자를 공개하거나 getDeclaredConstructor()를 사용하고 setAccesible(true)

+1

아, 모든 하위 클래스를 공용으로 설정해야한다는 것을 알지 못했습니다. –

관련 문제