[英]Using two different classloaders to load two children of the same class
我有两个班, Child1
和Child2
,班里的孩子Parent
。 Parent
类有一个静态成员,而两个子类都有使用此静态成员的静态方法run()
。 由于必须在同一应用程序中调用Child1.run()
和Child2.run()
,因此我希望每个子类都可以访问其自己的父类静态成员版本。
我知道将父类的静态成员放入子类会更容易,但是我无法修改类的源代码。
我读到我应该使用两个不同的类加载器,但是我不知道如何使用。 有人可以解释我如何使用类加载器来实现我提到的结果,也许带有一些示例代码?
是的,您可以使用两个不同的ClassLoader进行询问。 你需要编译的类( Parent
, Child1
和Child2
),但他们不应该在相同的类路径中的位置,你是从(调用类调用它们的类Main
)。
而是将它们放在目录中磁盘上的某个位置,或放在jar文件中。
在该位置,您可以创建多个类加载器,并可以使用loadClass
方法加载类。 您可以使用反射来调用方法,例如在其上run
的方法。
import java.lang.reflect.*;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL childAndParentClassesLocation = new URL("c:/Somewhere/On/Your/Disk");
ClassLoader cl1 = new URLClassLoader(new URL[] { childAndParentClassesLocation }, Main.class.getClassLoader());
ClassLoader cl2 = new URLClassLoader(new URL[] { childAndParentClassesLocation }, Main.class.getClassLoader());
Class child1 = cl1.loadClass("packagename.Child1");
Class child2 = cl2.loadClass("packagename.Child2");
Method child1Run = child1.getMethod("run");
Method child2Run = child2.getMethod("run");
child1Run.invoke(null); // Invoke run method on Child1
child2Run.invoke(null); // Invoke run method on Child2
}
}
ps这对于通用应用程序来说是不好的设计,但是您并没有说您在制作通用应用程序。 因此,我认为没有任何理由通过劝说有助于解释JVM工作原理的有趣问题来简化SO。
好吧,类级别成员/静态成员的目的是每个JVM具有一个副本。 您在问题中提出的建议正在克服上述目的。
如果是这种情况,则应使用实例级别的成员来实现。 看到这个
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.