SPIGOT:在不重新初始化插件的情况下调用非静态方法



在过去的4天里,我一直在研究并试图找出这个问题。遗憾的是,由于与我的问题相关的糟糕的文档和缺乏社区支持,我最终决定求助于StackOverflow。

这是我的问题,每个Java程序员都知道或应该知道,你根本不应该使用静态变量、类、方法等。对吗?好吧,似乎每当我试图从外部类调用方法时(通过启动存储非静态方法的主类的新实例(,Spiget都会抛出一个java.lang.IllegalArgumentException:插件已经初始化错误!

因此,我的问题是,如何在不触发此错误的情况下获得主类的实例并从所述类(从外部类(运行方法?正如我所说的,我在互联网上搜索过,试图找到这个问题的答案。我得到的最符合逻辑的答案可以在时间之父发布的这里找到:https://bukkit.org/threads/how-do-you-refer-to-a-non-static-method.69920/

我更改了时间之父给出的答案以满足我的需求(我试图访问的方法位于我的主类中,而不是其他类(这是我目前适用的代码:

主要类别

public final class MainClass extends JavaPlugin implements Listener {
private static final MainClass mainClass = new MainClass();
...
public MainClass() {}
public static MainClass getMainClass()
{
return mainClass;
}
private void exampleMethod() {
}
...
}

二级

import com.example.namespace.MainClass;
...
public class CommandClass implements CommandExecutor {
...
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
MainClass.getMainClass().exampleMethod()
}
...
}

时间之父的描述背后的原因是,我们没有使类本身或其任何变量/方法成为静态的。但是,只需使用静态getter获取类的一个实例。这一切看起来都应该起作用(它的编译也很好(。

我对Java还很陌生,老实说,很多与跨类通信相关的东西对我来说都很难理解。需要明确的是,这只是我制作实验插件来帮助自己学习语言(我通过实践学习得更快,而不仅仅是阅读哈哈(。我已经知道,静态疯狂是一种糟糕的做法,这就是为什么我如此沮丧,即使我试图做正确的事情,我也无法在互联网上找到一个有效的答案!

非常感谢任何帮助/建设性的批评!我希望最终能够开始为Minecraft编写出色的插件,但我需要首先适应Java环境。

好吧,在花了半个小时写下我的问题XD后,我甚至无法开始说我有多恼火,但也松了一口气受到@Sweeper在评论中所说的话的启发。我又在谷歌上搜索了一次。我发现了这个链接:

https://www.spigotmc.org/threads/best-method-for-getting-instance-of-main-class.365480/

我能够立即替换我的代码并使一切正常工作!正如我所说,我在这个领域仍然很不在行,对我来说,当我在MainClass中添加new MainClass()行时,我认为这是我调用类的实例。所以我从来没有想过我没有这么做。

当Sweeper说";我要求您展示如何以及在哪里创建CommandClass的实例";我当时想,";等等,我以为X是我得到的实例";因此,我对它进行了更多的搜索,并得出结论,我。。。。白痴。

这是一个简单的问题,我不敢相信它困扰了我这么长时间!感谢扫码员间接回答我的问题!:D

最新更新