我有三个我无法修改的课程。简而言之,我有一个类程序,以及其他两个类,ProgramClient和ProgramServer,继承自Program。类程序有一个静态变量。
到目前为止,我在两个不同的应用程序中运行ProgramClient和ProgramServer,没有任何问题。 现在我需要在同一个应用程序中运行这两个类。这样做,他们共享父类的静态变量,所以发生了不好的事情。
如何将这两个类保存在自己的“上下文”(JVM?)中,以确保静态变量仅被其中一个子类使用?
答案 0 :(得分:1)
根据定义,静态变量不能在类之间重写或重复。
但是,可以使用两个不链接的单独的类加载器来分隔这两个类。这正是J2EE容器提供商在Web应用程序之间分离的方式。
换句话说,您将基类Program
加载到JVM中两次,并将它们分开。从而为每个单独的“程序”提供自己的实例。关于班级装载者here可以学到更多。
这是一个非常简单的示例引导程序。启动ProgramClient
命令时,请确保ProgramServer
和java
的代码不在系统类路径中。您还需要将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)
静态方法或变量没有继承或覆盖,因为在所有程序中只有一个引用。那个目标如果是静态的。 也许你必须创建一个为每个程序类实例化的上下文类。