是否有注释处理器来强制执行模块可见性规则?

时间:2013-11-24 18:12:46

标签: java annotations javac

在我的项目中,我们有大约20个不同的模块打包成单独的jar,每个jar文件都有一些包。这些包中的一些类是公共的,因此在包外可见,即使这些类应该被视为模块的私有。

鉴于Java没有内置模块系统,我不想将OSGI引入我的应用程序。我正在寻找@Override注释的内容,我可以坚持使用类型来声明它们是模块的私有。然后让一些注释处理器强制执行这些规则。

以下几行。

   @ModuleDefinition
    public class FooModule{} // empty marker class so it can be referenced by other annotations

    @ModulePrivate(FooModule.class)
    public class SomePrivateFooModuleClas{}

    @ModulePublic(FooModule.class)
    public class SomePublicFooModuleClass{}

让我们说下面的代码位于另一个模块

   @ModuleDefinition
   public class BarModule{}

    // the annotation processor should generate an error on the import 
    // statement below because the class being imported is module private
    // and the class that the import belong to is not in the same module
    import com.example.SomePrivateFooModuleClass;

    @ModulePrivate(BarModule.class)
    public class SomePrivateBarModuleClas{
        SomePrivateFooModuleClass foo = ... etc    
    }

是否有任何开源库/注释处理器按照我上面概述的方式执行某些操作。

如上所述的这种方案是否可以由注释处理器实现,或者它是否超出了注释处理器的设计功能。

我不关心模块的运行时隔离,停止和重新加载模块,或osgi带来的任何其他强大功能,我只是希望开发人员不要偶然使用模块私有类。

1 个答案:

答案 0 :(得分:0)

我实现了类似于你想要的东西。我没有使用注释处理器,而是使用ASM来解析类文件。请查看http://www.jabsaw.org

我采用了与您概述的方法略有不同的方法:模块也被定义为空标记类,但注释定义了哪些类属于模块(默认情况下,同一包中的所有类)。此外,每个模块都定义了它导入的模块。只能使用导入模块中的类。

所以我的方法更倾向于依赖组织。

但是,您可以重复使用解析代码,无论是复制/粘贴方式还是重构方式。

如果我理解正确,您的模块目前由您的罐子代表。使用解析代码,您可以解析所有jar中的所有类,确定类依赖关系并跟踪解析类的jar。

使用不带参数的@JarPrivate,然后可以检查是否有任何类使用来自另一个jar的@JarPrivate类。

如果您仍感兴趣,请告诉我,我很乐意为您进行必要的重构。