当前位置: 首页 > 知识库问答 >
问题:

确保从另一个方法调用方法?

司寇星海
2023-03-14

我有一个层,称为Service,另一个称为Perache。我想知道我是否可以强制执行一条规则,上面写着:

在参数列表包含名为foo的参数的服务层中的任何公共类的任何公共方法中,断言它从权限层调用方法(理想情况下,确保在服务层中的任何其他方法之前调用该方法)。

ArchUnit可以这样做吗?

共有1个答案

鞠通
2023-03-14

它不是现成的,但您可以通过以下解决方案实现该目标:

DescribedPredicate<JavaClass> isPermissionClass = JavaClass.Predicates
    .resideInAnyPackage("..permission..");

classes()
    .that().resideInAnyPackage("..service..")
    .should(new ContainOnlyMethodsCallingPermissionClass(isPermissionClass));

ContainOnlyMethodsCallingPermissionClass可以定义如下。它首先收集所有声明的方法,然后检查对权限类的传出方法调用是否涵盖所有收集的方法。

public static class ContainOnlyMethodsCallingPermissionClass extends ArchCondition<JavaClass> {

    private final DescribedPredicate<JavaClass> isPermissionClass;

    public ContainOnlyMethodsCallingPermissionClass(DescribedPredicate<JavaClass> isPermissionClass) {
        super("only contain methods calling a permission class");
        this.isPermissionClass = isPermissionClass;
    }

    @Override
    public void check(JavaClass javaClass, ConditionEvents events) {
        Set<String> methodIdentifiers = getMethodIdentifiersOfClass(javaClass);
        methodIdentifiers.removeAll(collectMethodsCallingPermissionClass(javaClass));

        for (String methodId : methodIdentifiers) {
            events.add(new SimpleConditionEvent(javaClass, false, methodId));
        }
    }

    private Set<String> collectMethodsCallingPermissionClass(JavaClass javaClass) {
        Set<String> methodIdentifiers = new HashSet<>();

        for (JavaAccess<?> access : javaClass.getAccessesFromSelf()) {
            if (!isCallFromMethod(access)) {
                continue;
            }

            if (isMethodCallToPermissionClass(access)) {
                JavaMethod callingMethod = (JavaMethod) access.getOwner();
                methodIdentifiers.remove(callingMethod.getFullName());
            }
        }

        return methodIdentifiers;
    }

    private Set<String> getMethodIdentifiersOfClass(JavaClass javaClass) {
        return javaClass.getMethods().stream().filter(method -> !method.isConstructor())
                .map(method -> method.getFullName()).collect(Collectors.toSet());
    }

    private boolean isCallFromMethod(JavaAccess<?> access) {
        return access.getOrigin() instanceof JavaMethod;
    }

    private boolean isMethodCallToPermissionClass(JavaAccess<?> access) {
        return isPermissionClass.apply(access.getTargetOwner());
    }
}

您还可以将在JavaClass上操作的谓词更改为在JavaMethodCall上操作的谓词,以便更准确地定位相关的权限方法。这还允许过滤掉服务层中不相关的方法(例如,toString()方法)。

 类似资料:
  • 问题内容: 我正在研究一个问题,但由于刚开始学习Java而感到非常困惑。我可以理解的任何帮助都会很棒。我必须编写一个具有两个类的程序。主类将从文件中读取内容,并使用第二类来查找文件中相同单词被重复的次数,然后将它们添加到包含单词和单词重复次数的数组中。我可以阅读文件部分。我只是似乎不知道如何从第二个类调用方法以将单词添加到数组并增加计数器。到目前为止,这是我的代码,如果您运行它,您将看到多少错误会

  • 问题内容: 我知道这个问题是重复的,但是我在Internet上找不到答案。 我想从另一个类调用一个方法。 我有Class1和Class2。 在第2类中,我具有该方法: 我想从Class1调用该方法。 感谢您的任何答复。 - - 编辑 - - -— LogCat– 问题答案: 您应该使用以下代码: 如果您不想创建一个新的实例来调用该方法,则可以将方法标为十进制,然后只需调用即可。

  • 问题内容: 在Python中,有没有一种方法可以从另一个类中调用一个类方法?我正在尝试在Python中旋转自己的MVC框架,但无法弄清楚如何从另一个类的一个类调用方法。 这是我想发生的事情: 我正在从PHP慢慢进入Python,因此我正在寻找与PHP等效的Python 。 问题答案: 更新:刚刚在您的帖子中看到了对它的引用。那不一样。用于获取函数对象,然后使用您的参数调用它 现在是一个实际的函数对

  • 我创建了两个类:和。下面是进行计算的方法: 这里是一个调用并显示结果的函数,不幸的是,我无法根据这本书要求它运行的方式来运行它。 任何提示都会帮助我在我的再教育过程中。

  • 问题内容: 我有 但后来当我打电话从通过运行以下命令在命令行上,JAVA抱怨说,你不能调用从静态功能的方法。 所以我的问题是:如何从主方法调用方法,如果不可能,使用java命令从命令行运行程序后,有哪些替代策略可以调用方法。 问题答案: 您只能针对类的实例调用类似的实例方法(顺便说一下,这是一个非法的方法名称): 另外,如果对您的设计有效,则也使它成为静态。

  • 问题内容: 我已经尝试了一段时间(同样,在这里搜索),当在其他片段中按下按钮时,它可以帮助我刷新MainFragment中的listView。Sommeone可以解释一下如何使其工作吗? 这是带有函数的MainFragment(我不包括其他函数,因为我看不到它们如何起作用): } 这是另一个片段: } 问题答案: 这段代码最适合我。似乎很容易