代码之家  ›  专栏  ›  技术社区  ›  pixel

ArchUnit规则检查类是否在同一个包或子包中访问?

  •  0
  • pixel  · 技术社区  · 5 年前

    我用自定义注释对类进行了注释 @Inner .

    我想为创建一个规则 ArchUnit 以检测是否在同一个包或子包中访问了用此特定注释注释注释的类。

    例如:

    包裹: com.example.my.package

    包含类: MyInner 注释如下 @内部

    因此,规则应该检查 MyInner 只能从以下位置访问 com.example.my包 com.example.my.package.baz

    0 回复  |  直到 5 年前
        1
  •  0
  •   pixel    5 年前

    我发现了这样一条规则:

    public class DependencyRules {
    
        @PublicAPI(usage = ACCESS)
        public static ArchCondition<JavaClass> accessClassesThatResideInAnUpperPackage() {
            return new AccessClassesThatResideInAnUpperPackageCondition();
        }
    
        private static class AccessClassesThatResideInAnUpperPackageCondition extends ArchCondition<JavaClass> {
            AccessClassesThatResideInAnUpperPackageCondition() {
                super("access classes that reside in an upper package");
            }
    
            @Override
            public void check(final JavaClass clazz, final ConditionEvents events) {
                for (JavaAccess<?> access : clazz.getAccessesFromSelf()) {
                    boolean callToSuperPackage = isCallToSuperPackage(access.getOriginOwner(), access.getTargetOwner());
                    events.add(new SimpleConditionEvent(access, callToSuperPackage, access.getDescription()));
                }
            }
    
            private boolean isCallToSuperPackage(JavaClass origin, JavaClass target) {
                String originPackageName = getOutermostEnclosingClass(origin).getPackageName();
                String targetSubPackagePrefix = getOutermostEnclosingClass(target).getPackageName() + ".";
                return originPackageName.startsWith(targetSubPackagePrefix);
            }
    
            private JavaClass getOutermostEnclosingClass(JavaClass javaClass) {
                while (javaClass.getEnclosingClass().isPresent()) {
                    javaClass = javaClass.getEnclosingClass().get();
                }
                return javaClass;
            }
        }
    }
    

    来源: https://github.com/TNG/ArchUnit/commit/5f7fadc0f67ba61e2c9fe94bfe494303780c37d7