OSGi如何解决从使用OSGi自定义类加载器的bundle加载到从rt.jar加载的类的转换类的问题 1 ? rt.jar是否也加载了自定义类加载器,而不是系统类加载器?
UPD1
由于ClassLoader.java中的以下代码,我似乎可以使用自定义类加载器加载rt.jar的大部分内容:
private ProtectionDomain preDefineClass(String name, ProtectionDomain protectionDomain) {
...
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}
...
}
[1]问题如下:加载不同类加载器的类被jvm视为完全不同的类,即使它们的字节码完全相同,所以例如,当我们有类{{1}时如果它们由不同的类加载器加载,我们无法将rt.jar!/SomeClass
强制转换为bundle.jar!/SomeClassChild
。
答案 0 :(得分:4)
Java中没有这样的问题。当然不是问题所述。确实,不同类加载器加载的具有相同名称的类永远不会被视为同一个类,但是从这一点来看,并不是说超类必须由同一个类加载器作为子类加载。
实际上,因为包括Object在内的所有java。*类都来自bootstrap类加载器,并且引导类加载器中没有加载应用程序中的用户类,所以在OSGi出现之前,甚至不可能将任何内容转换为Object。进入图片。
答案 1 :(得分:1)
神奇的是,OSGi框架将所有这些包连接在一个类加载器网格中,确保每个包看到一致的类空间,没有冲突,即使多个类加载器可以加载相同的类名。因此,在具有适当元数据且没有类加载hacks的OSGi中,类转换异常不会发生。
如果两个bundle绑定到同一个包名的不同类加载器,那么OSGi框架确保这些bundle不能相互看到,因为它们然后驻留在不同的类空间中。