将捆绑的bundlecontext更改为public是否很危险?
我之所以要做的是从不同的包中访问Context。
当然,解决方法是在实例化对象时将上下文作为参数传递。但如果公开上下文不会太危险,那么这种方式会更容易。
答案 0 :(得分:1)
出于几个原因,我不会将BundleContext存储在公共静态变量中。
来自BundleContext的Javadoc:
BundleContext对象仅在其上下文包的执行期间有效;也就是说,在上下文捆绑包处于STARTING,STOPPING和ACTIVE捆绑包状态期间。 [...]
如果这样做,您可能会忘记在捆绑停止时设置静态变量。在这种情况下,其他人可以在标记为删除状态时访问捆绑上下文。在这种状态下,其他人仍然连接到这个捆绑包。
BundleContext对象通常用于私有使用其关联的bundle,并不打算与OSGi环境中的其他bundle共享。
通过将BundleContext分配给静态变量,您可以让其他人访问它。好吧,如果这个类是在一个非导出的包中,那就更难了,但仍然可以得到它。
Bundle可以适应其BundleContext。为了使此成功,如果Java运行时环境支持权限,则调用者必须具有相应的AdminPermission [bundle,CONTEXT]。
如果您意外地将此公共静态变量放入导出包中的类,则其他人可以在未经权限检查的情况下访问它。
如果导出和导入包
,则会出现问题想象一下,您有包A和B.包A已导出但也已导入。可能会发生包B中的类将看到来自不同包的包A类。在这种情况下,包B中的类将使用不同包的包上下文。
以上所有示例都是特殊的例子,但它们表明如果将BundleContext存储在静态变量中,您会遇到麻烦。如果你小心,你不会有任何麻烦,但请记住,你可能不是唯一一个改变项目代码的人。
通常,使用静态变量(常量除外)或函数不是一个好习惯,尤其是在OSGi中。如果你想使用它们中的任何一个,现在是时候询问你是否应该重构代码。
答案 1 :(得分:0)
我认为将BundleContext存储在静态变量中并不是一个好主意。最好从激活器启动方法创建类,并在那里注入BundleContext。