2014-09-23 59 views

回答

0

鉴于一个类由类名和加载该类的类加载器唯一标识的事实,parentchild1必须由bundle_1的类加载器加载。 child2将由bundle_2的类加载器加载。

+0

但child2的超级构造函数将在bundle_1上调用? – gstackoverflow 2014-09-23 17:11:52

+0

您的问题未提供足够的信息。这些类包含哪些包?捆绑包实际导出和导入了哪些包?另外,调用意味着你正在讨论线程。线程不属于捆绑。 – 2014-09-23 23:10:29

+0

@gstackoverflow:构造函数调用实际上与类加载的关系有限。你需要澄清你的意思“child2的超级构造函数将在bundle_1上调用”还是更好:你首先提出问题的理由。 – 2014-09-24 06:58:55

1

在OSGi中,每个bundle都有一个ClassLoader。加载类时,ClassLoader将首先查看该包的Import-Package语句。如果类来自导入的包,则将加载委托给提供该包的包的ClassLoader。如果没有这些匹配,那么捆绑将尝试从它自己的类中加载类。 (这是简化了一点,但应该足够你的情况)。

所以父类和child1类将由bundle_1的ClassLoader加载,并且child2将由bundle_2的ClassLoader加载。

还有一件事要记住。 Java中的每个类都存储在“class”.getClassLoader()中创建此类的ClassLoader。所以这可以让你轻松检查真正发生的事情。只需实例化child1和child2并打印ClassLoaders。

与此相关的另一件事是,如果您在类A的代码中使用新的“Classname”(),那么这将触发加载类A的ClassLoader(当然可以委派它)。

+0

父类是否会加载两次? – gstackoverflow 2014-09-24 19:05:08

+0

否。当类加载委派时,bundle1的类加载器将知道它已经加载了父类。 – 2014-09-25 16:43:52