OSGi如何解决将包定义的类转换为rt.jar定义的类的任务?

时间:2012-05-18 09:08:16

标签: java osgi concept

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

2 个答案:

答案 0 :(得分:4)

Java中没有这样的问题。当然不是问题所述。确实,不同类加载器加载的具有相同名称的类永远不会被视为同一个类,但是从这一点来看,并不是说超类必须由同一个类加载器作为子类加载。

实际上,因为包括Object在内的所有java。*类都来自bootstrap类加载器,并且引导类加载器中没有加载应用程序中的用户类,所以在OSGi出现之前,甚至不可能将任何内容转换为Object。进入图片。

答案 1 :(得分:1)

  • java。*类是特殊的... Java规范要求所有以'java'开头的类。出于安全原因从引导类路径加载。
  • 来自rt.jar的其他类,well包由框架本身导出。所有框架都有一组默认值,但有一些属性允许您扩展这些默认值(org.osgi.framework.system.packages [.extra])。该框架将从加载框架的类加载器或基于启动属性的引导类加载器加载这些包中的类。

神奇的是,OSGi框架将所有这些包连接在一个类加载器网格中,确保每个包看到一致的类空间,没有冲突,即使多个类加载器可以加载相同的类名。因此,在具有适当元数据且没有类加载hacks的OSGi中,类转换异常不会发生。

如果两个bundle绑定到同一个包名的不同类加载器,那么OSGi框架确保这些bundle不能相互看到,因为它们然后驻留在不同的类空间中。