Java中继承静态变量的问题

时间:2014-11-15 12:00:02

标签: java inheritance static-members

我有三个我无法修改的课程。简而言之,我有一个类程序,以及其他两个类,ProgramClient和ProgramServer,继承自Program。类程序有一个静态变量。

到目前为止,我在两个不同的应用程序中运行ProgramClient和ProgramServer,没有任何问题。 现在我需要在同一个应用程序中运行这两个类。这样做,他们共享父类的静态变量,所以发生了不好的事情。

如何将这两个类保存在自己的“上下文”(JVM?)中,以确保静态变量仅被其中一个子类使用?

2 个答案:

答案 0 :(得分:1)

根据定义,静态变量不能在类之间重写或重复。

但是,可以使用两个不链接的单独的类加载器来分隔这两个类。这正是J2EE容器提供商在Web应用程序之间分离的方式。

换句话说,您将基类Program加载到JVM中两次,并将它们分开。从而为每个单独的“程序”提供自己的实例。关于班级装载者here可以学到更多。

这是一个非常简单的示例引导程序。启动ProgramClient命令时,请确保ProgramServerjava的代码不在系统类路径中。您还需要将URL更改为包含目标程序代码的jar文件。

public class Bootstrap  {
    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        URLClassLoader cl1 = new URLClassLoader(
                new URL[] {
                        new URL("file:///client.jar")
                },
                Bootstrap.class.getClassLoader()

        );

        URLClassLoader cl2 = new URLClassLoader(
                new URL[] {
                        new URL("file:///server.jar")
                },
                Bootstrap.class.getClassLoader()
        );

        invokeAsync(cl1, "a.b.c.ProgramClient");
        invokeAsync(cl2, "a.b.c.ProgramServer");
    }

    private static void invokeAsync(final ClassLoader cl, final String fqn, final String...progArgs) {
        new Thread() {
            public void run() {
                try {
                    Class p1 = cl.loadClass(fqn);
                    Class argType = String[].class;

                    Method m = p1.getMethod("main", argType);

                    m.invoke(null, (Object) progArgs);
                } catch ( Exception e ) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

}

答案 1 :(得分:0)

静态方法或变量没有继承或覆盖,因为在所有程序中只有一个引用。那个目标如果是静态的。 也许你必须创建一个为每个程序类实例化的上下文类。