当前位置: 首页 > 知识库问答 >
问题:

SPIGOT:调用非静态方法而不重新初始化插件

秋建义
2023-03-14

在过去的4天里,我花了超过4天的时间研究并试图解决这个问题。可悲的是,由于与我的问题相关的糟糕的留档和缺乏社区支持,我最终决定转向StackOverflow。

这是我的问题,每个Java程序员都知道或应该知道,你基本上不应该使用静态变量,类,方法等正确的?嗯,似乎每次我试图从外部类调用方法(通过启动存储非静态方法的主类的新实例),Spiget抛出一个java.lang.IllegalArgumentExc的:插件已经初始化!错误!

所以我的问题是,我如何获得我的主类的一个实例,并从所述类(从一个外部类)运行一个方法,而不触发这个错误?正如我所说的,我搜索了互联网试图找到这个问题的答案。我得到的最符合逻辑的答案可以在时间之父的帖子中找到:https://buk kit . org/threads/how-do-you-refer-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环境。

共有1个答案

澹台华晖
2023-03-14

好吧,我甚至不能说我有多恼火,但是在花了半个小时写出我的问题XD后,我终于明白了这一点,这是由@Sweeper在评论中说的话引起的。我又用谷歌搜索了一下。我发现了这个链接:

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

我立即能够替换我的代码,让一切正常工作!正如我所说的,我在这个领域还很无知,当我在我的MainClass中添加< code>new MainClass()行时,我把它看作是我调用的类的实例。所以我从没想过我没有做。

当Sweeper说“我要求你展示你是如何以及在哪里创建一个CommandClass的实例”时,我就想,“等等,我以为X是我得到的实例”,因此导致我搜索它更多一点,并得出结论,我是....一个白痴。

问题很简单,我真不敢相信它困扰了我这么久!感谢清扫工间接回答我的问题!:D

 类似资料:
  • 我最近对 PHP 5.4 进行了更新,但收到有关静态和非静态代码的错误。 这是错误: 这是第371行: 我希望有人能帮忙。

  • 我正在使用存储库模式并尝试建立模型之间的关系。当我尝试运行存储()方法(在控制器中),该方法试图使用用户()方法(与方模型建立关系)时,我收到以下错误消息: 非静态方法不应该静态调用::user(),假设$this来自不兼容的上下文 我不明白为什么在尝试运行user()relationship方法时会出现此错误,但所有其他方法(包括$this- 以下是相关代码:

  • 我一直试图用我的验证代码进行php pear验证,但我收到的都是严格标准错误--问题是什么?我如何修复它? 电子邮件验证.php

  • PHP严格标准:不应在第33行的/web/sites/blah/somescript.PHP中静态调用非静态方法pear::iserror() 我在MDB2上看到了类似的错误。稍后再详细介绍。 somescript.php: 问题 是否有不同的方法来调用而不会产生错误?

  • 我试图重新定义简单的非静态方法,但遇到了一个例外: 类别: 电话: 上面的类是scala类,但它们编译为标准的java类。 如何正确地重新定义方法?

  • 我正在尝试在varGrant CentOS VM上本地运行一个codegniter站点。我已经下载了所有文件,并设置了yaml/host文件等。 我在屏幕上看到这个错误。 遇到 PHP 错误 严重性:8192 消息:非静态方法 MY_Loader::d efine_module() 不应静态调用,假设$this来自不兼容的上下文 文件名:controllers/Front _ controller