Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取构造函数时发生Java NoSuchMethodException_Java_Reflection - Fatal编程技术网

获取构造函数时发生Java NoSuchMethodException

获取构造函数时发生Java NoSuchMethodException,java,reflection,Java,Reflection,我试图使用反射来加载类的实例。当我尝试这样做时,我得到了一个没有这样的方法异常。我检查了又检查,再检查。这个构造器显然是存在的。有人有什么想法吗?我以前在另一个项目中成功地使用过这个,代码基本相同,所以我不确定哪里出了问题。可在此处找到来源: private void loadCommands() { try { for (Class<?> clazz : ReflectionsReplacement.getSubtypesOf(BaseCom

我试图使用反射来加载类的实例。当我尝试这样做时,我得到了一个没有这样的方法异常。我检查了又检查,再检查。这个构造器显然是存在的。有人有什么想法吗?我以前在另一个项目中成功地使用过这个,代码基本相同,所以我不确定哪里出了问题。可在此处找到来源:

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;
}
private void loadCommands(){
试一试{
对于(类clazz:ReflectionsReplacement.GetSubsubsof(BaseCommand.Class,“us.zsugano.itemsave.commands”,plugin.getClass().getClassLoader(),BaseCommand.Class)){
BaseCommand BaseCommand=null;
试一试{
baseCommand=(baseCommand)clazz.getConstructor(ItemSave.class).newInstance(插件);
if(Listener.class.isAssignableFrom(clazz)){
plugin.getServer().getPluginManager().registerEvents((侦听器)baseCommand,plugin);
}
}捕获(例外e){
plugin.PluginPM.sendMessage(Level.SEVERE,“尝试加载命令时遇到的问题”);
e、 printStackTrace();
}
commands.add(baseCommand);
}
}捕获(例外e){
plugin.PluginPM.sendMessage(Level.SEVERE,“加载命令时捕获异常”);
e、 printStackTrace();
}
用于(基本命令:命令){
plugin.getCommand(command.getName().toLowerCase()).setExecutor(this);
}
}
公共抽象类BaseCommand{
公共项目保存插件;
公共BaseCommand(ItemSave插件){
this.plugin=plugin;
}
完整资料来源:

这是堆栈跟踪:

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)
19:43:10尝试加载命令时遇到[严重][ItemSave]问题。
19:43:10[严重]java.lang.NoSuchMethodException:us.zsugano.itemsave.commands。
StoreCommand.(us.zsugano.itemsave.itemsave)
19:43:10[严重]在java.lang.Class.getConstructor0(未知源)
19:43:10[严重]在java.lang.Class.getConstructor(未知源)
19:43:10[严重]在us.zsugano.itemsave.commands.CommandManager.loadComma
nds(CommandManager.java:32)
19:43:10[严重]攻击美国。zsugano.itemsave.commands.CommandManager。(Co
mmandManager.java:23)
19:43:10[严重]在us.zsugano.itemsave.itemsave.onEnable(itemsave.java:1
9)
19:43:10[严重]在org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlug
in.java:217)
19:43:10[严重]见org.bukkit.plugin.java.javapluginload.enablePlugin(
JavaPluginLoader.java:457)
19:43:10[严重]见org.bukkit.plugin.SimplePluginManager.enablePlugin(Si
mplePluginManager.java:381)
19:43:10[严重]见org.bukkit.craftbukkit.v1_6_R2.CraftServer.loadPlugin
(CraftServer.java:282)
19:43:10[严重]见org.bukkit.craftbukkit.v1_6_R2.CraftServer.enablePlug
ins(CraftServer.java:264)
19:43:10[严重]在net.minecraft.server.v1_6_R2.MinecraftServer.l(Minecr
aftServer.java:313)
19:43:10[严重]在net.minecraft.server.v1_6_R2.MinecraftServer.f(Minecr
aftServer.java:290)
19:43:10[严重]在net.minecraft.server.v1_6_R2.MinecraftServer.a(Minecr
aftServer.java:250)
19:43:10[严重]在net.minecraft.server.v1_6_R2.DedicatedServer.init(Ded
icatedServer.java:151)
19:43:10[严重]在net.minecraft.server.v1_6_R2.MinecraftServer.run(我的
craftServer.java:391)
19:43:10[严重]在net.minecraft.server.v1_6_R2.ThreadServerApplication。
运行(源文件:582)

在StoreCommand.java中,我看到这个包的私有构造函数:

StoreCommand(ItemSave plugin) {
  super(plugin);
}
从getConstructor的API文档(重点矿山):

返回一个构造函数对象,该对象反映指定的public 此类对象表示的类的构造函数


将构造函数公开或使用
getDeclaredConstructor()
并设置然后执行
setAccessible(true)

这只是一个疯狂的想法,但如果构造函数不是公共的,也许可以尝试
getDeclaredConstructor
而不是
getConstructor
。另外,你不应该链接源代码,而是将其添加到问题中。它肯定是公共的,我不想在页面上包含几个文件的源代码,这会让我的问题变得更复杂很长。我应该这样做吗?不,你应该把它精简为一个完整的程序,只包含几行代码来重现问题。你应该只发布代码的重要部分。这不应该太长。用两个类来完成复制过程可能会对你有帮助。你可以了解更多有关pro的信息问题,如果没有,你将有代码来发布,清楚地说明问题,并尽量不分散(对我们)你试图完成的所有其他事情的注意力。哦,我没有意识到我必须公开所有子类well@Gus:在参数化构造函数之外不添加参数构造函数时有效。