2013-08-05 36 views
5

Tôi đang cố gắng sử dụng các phản xạ để tải một thể hiện của một lớp. Tôi nhận được một ngoại lệ như vậy khi tôi thử và làm điều đó. Tôi đã kiểm tra và kiểm tra và kiểm tra lại. Nhà xây dựng đó rõ ràng không tồn tại. Có ai có ý tưởng nào? Tôi đã sử dụng thành công điều này trước khi vào một dự án khác với mã cơ bản giống nhau vì vậy tôi không chắc chắn nơi tôi hơi say lên. Nguồn có thể được tìm thấy ở đây:Java NoSuchMethodException khi nhận được hàm tạo

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

Full Nguồn: https://github.com/zachoooo/ItemSave

Và đây là 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

ý tưởng Chỉ cần hoang dã, nhưng có lẽ thử 'getDeclaredConstructor' thay vì 'getConstructor' trong trường hợp nhà xây dựng không được công khai. Ngoài ra, bạn không nên liên kết mã nguồn nhưng thêm nó vào câu hỏi. – Pshemo

+0

Nó chắc chắn là công khai, và tôi không muốn phải bao gồm nguồn cho một vài tập tin trên trang, mà sẽ làm cho câu hỏi của tôi khá dài. Tôi có nên làm điều đó không? –

+1

Không, bạn nên cắt nó xuống một chương trình đầy đủ chỉ chứa một vài dòng mã để tái tạo vấn đề. – Dukeling

Trả lời

10

Trong StoreCommand.java tôi thấy gói này xây dựng tư nhân:

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

từ tài liệu API của getConstructor (nhấn mạnh mỏ):

Trả về đối tượng Constructor phản ánh số công khai hàm tạo của lớp được đại diện bởi đối tượng Lớp này.

Hoặc làm cho công chúng constructor hoặc sử dụng getDeclaredConstructor() và thiết lập sau đó làm setAccesible(true)

+1

Ồ, không nhận ra tôi đã phải làm cho tất cả các lớp con cũng công khai –

Các vấn đề liên quan