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

时间:2016-03-27 07:27:12

标签: 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文件中的密钥名称将来可能会有所不同。我的想法是将名称放在主类中,以便MyListener可以引用它们。这种方法可以更加集中化名称列表,并防止将来对多个类进行大量更改。

3 个答案:

答案 0 :(得分:1)

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

您在初始设计中做了两件事情,使您的任务变得复杂:您已经变量static并且您已将其变为public。这两个都是糟糕的OO设计:

  • 静态变量对可测试性不利,并且不能多态地使用(或者动态地#34;当你用它来表达时)。
  • 公共变量不利于抽象。 (特别是非最终的!)

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

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();
    ...
}

答案 1 :(得分:0)

将其作为参数传递:

public MyListener(Plugin instance, String path) {
    Plugin plugin = instance;
    this.path = path;    // <-- the problem...
}

 public class MyPlugin extends JavaPlugin {
    public static String compath = "CommandFileName";

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

答案 2 :(得分:0)

我想你想要

public MyListener(MyPlugin instance) {
        MyPlugin plugin = instance;
        path = plugin.compath;

问题是您使用的是Plugin而不是MyPlugin