You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ArchUnit禁止Streaming API、Builder API等通用API的随意调用

可行解决方案

以下方案均不需要提前获知ownerName,可实现对指定范围内类调用指定方法的精准管控:

1. 基于ArchUnit编写架构约束单元测试

这是适用性最高、落地成本最低的方案,ArchUnit是专门用于Java架构合规性校验的类库,可直接通过方法名匹配调用行为,同时限定调用方的范围:

  • 支持直接按方法名匹配所有目标调用,无需指定所属类:
    示例规则(禁止业务包下的类调用stream()方法):
    ArchRule forbid_stream_api = noClasses()
      // 限定需要管控的类范围,可按包、类名前缀、注解等匹配
      .that().resideInAPackage("com.yourproject.business.module..")
      .should().callMethodWhere(target(name("stream")));
    
  • 针对Builder的build()方法禁止场景,可额外添加过滤条件避免误杀,比如限定目标方法所属类名以Builder结尾、或返回值类型和Builder所属类一致:
    ArchRule forbid_build_call = noClasses()
      .that().resideInAPackage("com.yourproject.business.module..")
      .should().callMethodWhere(
        target(name("build"))
        .and(target(owner(nameEndsWith("Builder"))))
      );
    
  • 规则直接写为普通单元测试,随项目单测阶段一起执行,不通过就会阻断构建,全团队自动生效,无需额外配置IDE或CI。

2. 配置IDE结构性搜索检查规则

针对本地开发阶段提前拦截的场景,可在IntelliJ IDEA等IDE中自定义结构性搜索(SSR)规则:

  • 新增检查规则,匹配调用stream()、build()的代码模式,将检查级别设置为错误
  • 限定规则生效的文件范围为你需要管控的类所在的目录/包
  • 可导出规则配置同步给团队所有成员,本地开发时不符合规则的代码会直接标红提示

3. CI/CD流水线加静态代码扫描卡点

作为兜底校验方案,可在CI流水线中新增自定义扫描步骤:

  • 基于ASM、Byte Buddy等字节码分析工具,扫描所有管控范围内类的class文件
  • 匹配方法调用指令中方法名为stream、build的调用记录
  • 命中规则则直接中断流水线,返回错误原因。

4. 自定义构建插件检查规则

如果项目使用Maven/Gradle构建,可基于Checkstyle、SpotBugs等插件扩展自定义规则:

  • 匹配抽象语法树(AST)中的方法调用节点,无需知道方法所属类,直接按方法名过滤
  • 限定调用方的类范围,命中后直接抛出编译错误,阻断构建流程。

内容的提问来源于stack exchange,提问作者Mahatma_Fatal_Error

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:24:04