java - 方法访问和非导出包

标签 java osgi

我有一个包含两个包的 OSGi bundle :

  1. com.organization.api 此包已导出。
  2. com.organization.internal 此包未导出。

com.organization.api中,我有一个接口(interface)Foo和类AsbtractFoo

package com.organization.api;

public abstract class AbstractFoo implements Foo {

   private int state;

   @Override
   public int getState(){ 
       return this.state; 
   }
}

com.organization.internal中,我有一个类FooManager需要更改Foo的状态。如何在 com.organization.internal 之外的任何其他类无法更改 foo 的状态的条件下执行此操作。

package com.organization.internal;

public class FooManager {

   private ???? foo = ....

   public void updateFooState(){
      foo.????();
   }
}

我尝试添加具有默认访问权限的 setter (void setState(int state)) 的 AbstractStatefullFoo 来打包 com.organization.internal 并让 AbstractFoo 扩展 AbstractStatefullFoo 但问题是,在这种情况下,其他 bundle 需要导出包 com.organization.internal

OSGi 中如何解决这样的问题?

最佳答案

我感觉您正在考虑将所有这些抽象类变得复杂。

最简单的情况是有一个带有 getState 的接口(interface) Foo。 然后你就可以在内部包中实现 Foo 了。

这种情况不需要其他包能够访问内部的 impl 类。关键是api包中还要有一个FooManager的接口(interface)。

然后,您创建实现 FooManager 的 FooManagerImpl 并将其导出为带有接口(interface)的服务。然后,其他包可以使用此服务来调用 updateState() 方法和其他操作 FooImpl 类的方法。

关于java - 方法访问和非导出包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44086086/

相关文章:

eclipse - 从 Eclipse IConfigurationElement 获取 OSGI Bundle

java - Dropwizard Forms MULTIPART - 启动时资源抛出错误

Java -jar 无法使用自定义文件夹名称(云)代替默认库

java - 有没有办法通过使用android按下方便键来触发方法?

java - 如何将这些 UTF-8 文字转换为字符串?

java - 运行多个 Equinox OSGi 框架

java - 如何在博客中玩java游戏

grails - Groovy + OSGi还是Grails?

java - LinkedBlockingQueue.take() 似乎一直很忙

eclipse - 由于缺少类而无法调试 Eclipse 应用程序