Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制其他Java包对Java包的访问_Java_Static Code Analysis - Fatal编程技术网

限制其他Java包对Java包的访问

限制其他Java包对Java包的访问,java,static-code-analysis,Java,Static Code Analysis,假设我有三个公共java包: my.com.model my.com.view my.com.controler 现在我想限制允许哪个包从专用包导入类 例如,view包中的类只允许从Controller包中导入类 但不允许从模型包和Controller包中导入类,而只允许从模型包导入类 不从视图包访问,并且模型包根本无法访问模型和视图包 我怎样才能做到这一点?我知道Java不支持这样的需求,所以可能需要一些静态代码 分析工具可以帮助我 更新:我正在使用Java 7您可以通过在一个单独的模块中提

假设我有三个公共java包:

my.com.model
my.com.view
my.com.controler
现在我想限制允许哪个包从专用包导入类

例如,view包中的类只允许从Controller包中导入类 但不允许从模型包和Controller包中导入类,而只允许从模型包导入类 不从视图包访问,并且模型包根本无法访问模型和视图包

我怎样才能做到这一点?我知道Java不支持这样的需求,所以可能需要一些静态代码 分析工具可以帮助我


更新:我正在使用Java 7

您可以通过在一个单独的模块中提取每个关注点来定义它

视图模块将依赖于控制器模块,控制器模块将依赖于模型模块

您可以使用Maven来实现这些约束

例如,您可以定义一个包含3个模块的reactor或多模块Maven项目


Maven为声明的依赖项提供可传递的依赖项。因此,为了充分尊重您的需求,
视图
模块应该排除由
控制器
依赖项拉入的可传递的
模型
依赖项。

将它们拆分到不同的模块上,并且只声明对您想要访问的模块的依赖项。您可以使用AspectJ来实现这一点。请参阅下面的博客。如果有人有时间,可以把它变成一个答案。因此,总结一下:如果您有模块支持(从Java9开始将成为本机的,现在可以通过其他工具使用),那么就声明具有正确依赖关系的模块。若您启用了编译时编织的AspectJ,那个么正如链接文章中所建议的那个样,您可以使用它。如果两者都没有,那么你可能就不走运了,因为如果没有这些工具,在Java中是不可能做到这一点的。在后一种情况下,您必须建立严格的审核流程,并沉迷于手工操作。从JDK 9开始,您可以使用
module
s来实现这一点。