我对OSGi比较陌生,我们部门正在转向OSGi框架。我有两个bundle A和B。B依赖于A,所以我把它包含在B的manifest文件中,作为Import-Package:A。
同样,我在a中有一个特定的类,它使用反射从B访问特定的类。A中的Class使用Class。我想摆脱这个反射,因为这可能会导致问题,当我转移到OSGi框架。我怎样才能摆脱这个class.forName()?
谢谢! !
在OSGi中,您将希望远离反射,原因在许多其他地方概述。
所以,你的情况是bundle A
需要某个类的实例,该类驻留在bundle B
中。对于A
使这个实例的意义,我将假设它有一些接口,它将用于与实例交谈。让我们把它具体化一点。
/Bundle A
/ThingyInterface.class
/Bundle B
/ThingyImplementation.class (implements ThingyInterface.class)
这是一个常规模式:一个包提供接口,另一个提供实现。现在有两种可能的情况,
-
A
只需要一个实现副本。在这种情况下,将Thingy
注册为服务。 -
A
需要几个实现实例。在这种情况下,在A
中引入ThingyFactory
,并在B
中创建该工厂的实现,然后将其注册为服务。
在这两种情况下,你让B
做实际的实例化,你没有从A
到B
的依赖,B
不需要反射来实例化对象。
总之,服务是您的朋友。
在我看来,有两种方法可以在Java中创建对象
- 通过new 调用构造函数
- 使用反射
所以如果你想避免反射,你只能在bundle A中导入class,然后导入new()实例(为了做到这一点,你需要在bundle A中导入B).但是由于bundle B已经依赖于A,这将导致交叉依赖,这在OSGi中是不允许的。所以我建议你重构你的类,从bundle A中提取这样的代码,并移动到bundle b中。
我不知道你确切的用例,但听起来你好像在做意大利面。你说Bundle B依赖于A,但是A必须通过反射从B加载一个类。这意味着A也依赖于B。因为你不能有B -> A -> B,你需要删除一个依赖项。
或者您可能需要另一个bundle C,它包含A和b共同的任何类。请记住,OSGi是用来帮助您创建具有干净接口的模块的。如果您发现在使用OSGi时遇到问题,可能是因为某些抽象泄漏或某些依赖项没有被很好地设计。