java – 控制对“.internal”包的访问的最佳实践

我编写 Eclipse插件并将一些类作为API导出,同时希望限制对其他类的访问.

我遵循Eclipse将这些类分成“.internal”子包的常见习惯.

然而,我不能在这些类上使用“包”或认级别访问,因为它们中的许多需要被导出的类使用.

防止或阻止我的API的用户为了自己的目的使用这些类的最佳做法是什么?有自动检查器吗?

我承认,当我没有选择时,我已经使用了一些Eclipse的内部类

澄清:我有类似的需要非插件代码.

解决方法

不是仅仅是将meta-inf / MANIFEST.MF更新为一个插件osgi项目(如果还没有?).它应该看起来像:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: My-plugin
Bundle-SymbolicName: com.mycompany.mypluginname
Bundle-Version: 1.0.0
Bundle-vendor: MyCompany
Bundle-requiredExecutionEnvironment: JavaSE-1.6
Service-Component: 
Import-Package: org.apache.log4j;version="1.2.14" (,separated etc)
Export-Package: com.mycompany.mypluginname.myapipackage;version="1.0.0"

然后很好地省略了.内部包.平台应该休息.

顺便说一下,然后使用Import-Package:在任何依赖的bundle,plugins等中,而不是依赖于jar / project(这是老的,吮吸的方式,它不起作用 – 正如你所发现的).

这样可以大大减少你的代码依赖关系.如果你决定你的插件代码应该属于不同的jar / bundle,那么你只需移动单独的包,并使新的bundle / plug-in导出它.由于客户端捆绑从“云”导入包(云作为Osgi平台),您可以更自由地移动代码.

注意:如评论中所述,您不需要在Osgi中运行应用程序来获得此“受益”. Eclipse可以在Osgi包限制下编译它的代码,并且您的构建/服务器可以在“未受保护的世界”中运行.例如Osgi清单不对第三方(希望使用内部)执行任何操作,但对那些想要它们的人提供“通知”和限制.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量