如何避免OSGi中的class.forName()



我对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做实际的实例化,你没有从AB的依赖,B不需要反射来实例化对象。

总之,服务是您的朋友

在我看来,有两种方法可以在Java中创建对象

  1. 通过new
  2. 调用构造函数
  3. 使用反射

所以如果你想避免反射,你只能在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时遇到问题,可能是因为某些抽象泄漏或某些依赖项没有被很好地设计。

相关内容

  • 没有找到相关文章

最新更新