有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

例如:

包:com.example.my.package

包含类:MyInner,该类用@Inner注释

因此,规则应该检查MyInner是否仅从com.example.my.packagecom.example.my.package.baz访问


共 (1) 个答案

  1. # 1 楼答案

    我发现了这样的规则:

    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