java - 在Java中,如何动态访问主类?

标签 java

我正在尝试访问主类的变量。问题是我想让我的代码完全模块化,以便我可以在它的基础上构建并创建一个库。我遇到的问题是,为了访问变量,我必须使用主类的名称,如下所示:

    // this is in the main class which we will call "MyPlugin"
    public class MyPlugin extends JavaPlugin {
        public static String compath = "CommandFileName";

        @Override
        public void onEnable() {
            this.getServer().getPluginManager().registerEvents(new MyListener(this), this);
        }
    }

    // this is in the listener class which we will call "MyListener"
    public MyListener(Plugin instance) {
        Plugin plugin = instance;
        path = MyPlugin.compath;    // <-- the problem...

我的第一个想法是我应该能够简单地做到这一点:

    path = plugin.compath;

但是由于某种原因插件对象不包含compath变量。 有没有办法在不使用名称的情况下访问主类的变量?

现在对于那些可能喜欢思考目的的人来说更深入。 MyListener 将引用 yml 类型的配置文件。无论出于何种原因,配置 yml 文件中的 key 名称将来可能会有所不同。我的想法是将名称放在主类中,以便 MyListener 可以引用它们。这种方法将使名称列表更加集中,并防止将来对多个类进行大量更改。

最佳答案

简单的答案是在 JavaPlugin API 中声明一个 getter。

您在初始设计中所做的两件事使您的任务变得复杂:您将变量设置为静态,并将其设置为公共(public)。这两种都是糟糕的 OO 设计:

  • 静态变量不利于可测试性,并且不能多态地使用(或者用您的话说“动态”)。
  • 公共(public)变量不利于抽象。 (尤其是非最终版本!)

无论如何,这就是我实现这个的方式:

public abstract class MyPluginBase extends JavaPlugin {
    public abstract String getCompath();
    ....
}

public class MyPlugin extends MyPluginBase {
    @Override
    public String getCompath() {
        return "CommandFileName";
    }

    @Override
    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(
               new MyListener(this), this);
    }
}

public MyListener(MyPluginBase instance) {
    path = instance.getCompath();
    ...
}

关于java - 在Java中,如何动态访问主类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244904/

相关文章:

java - 注册网络应用程序后激活帐户

java - @RolesAllowed 不能在 Jersey 中使用自定义 SecurityContext?

java - Android Java 如何在 Activity 中连接网络摄像机

java - 手动链接列表 - 在方法之前插入

Java 10 : Replacement for java. xml.ws 冲突

java - 如何避免使用许多 @SerializedName ?

java - 探索pdf中的水平解析TJ(对tx公式的详细了解)?

java - JVM - CPU 使用率达到 100%

java - 如果 jobobject 从 JNI 返回到 JAVA,我应该删除 GlobalRef 吗?

java - 是 MyClass 的对象实例