与类加载器相关的问题是一个非常复杂的问题。无论如何,你都应该记住一些事实:
一个应用程序中的类加载器通常不止一个。引导程序类加载器委托给相应的。当你实例化一个新类时,将调用更具体的类加载器。如果找不到对你尝试加载的类的引用,它将委派给其父类,依此类推,直到你进入引导类加载器。如果它们都找不到你要加载的类的引用,则会得到ClassNotFoundException。
如果你有两个具有相同二进制名称的类,并且可以通过相同的类加载器进行搜索,并且想知道要加载的是哪个类,则只能检查特定的类加载器尝试解析类名称的方式。
根据Java语言规范,类二进制名称没有唯一性约束,但是据我所知,它对于每个类加载器都应该是唯一的。
我可以找出一种以相同的二进制名称加载两个类的方法,它涉及由两个不同的类加载器(覆盖默认行为)加载它们(及其所有依赖项)。一个粗略的例子:
ClassLoader loaderA = new MyClassLoader(libPathOne); ClassLoader loaderB = new MyClassLoader(libPathTwo); Object1 obj1 = loaderA.loadClass("first.class.binary.name", true) Object2 obj2 = loaderB.loadClass("second.class.binary.name", true);我总是发现类加载器定制是一项棘手的任务。如果可能,我宁愿避免使用多个不兼容的依赖项。



