使用两个不同的类加载器来加载同一个类的两个子类

时间:2014-11-17 14:29:22

标签: java classloader static-members

我有两个班级Child1Child2,班级Parent的孩子。类Parent具有静态成员,并且两个子类具有使用此静态成员的静态方法run()。因为我必须在同一个应用程序中调用Child1.run()Child2.run(),所以我希望每个子类都可以访问它自己的父类静态成员版本。

我知道将父类的静态成员放入子类会更容易,但我无法修改类的源代码。

我读到了我应该使用两个不同的类加载器,但我不明白如何。有人可以解释我如何使用类加载器来实现我提到的结果,也许有一些示例代码?

2 个答案:

答案 0 :(得分:2)

是的,您可以使用两种不同的ClassLoader。您需要编译类(ParentChild1Child2),但它们不应与您调用它们的类位于相同的类路径位置(调用该类{ {1}})。

相反,将它们放在磁盘上的某个目录中,或者将它们放在jar文件中。

从该位置,您可以创建多个类加载器,并且可以使用方法Main来加载类;并且您可以使用反射来调用方法,例如方法loadClass

run

P.S。这对于通用应用程序来说是糟糕的设计,但您没有说您正在制作通用应用程序。因此,我没有看到任何理由通过劝阻有助于解释JVM如何工作的有趣问题来愚蠢。

答案 1 :(得分:0)

那么,类级别成员/静态成员的目的是为每个JVM创建一个副本。你在问题中建议的是打败上述目的。

如果是这种情况,您应该使用实例级别成员来实现它。见this