Java 在ArchUnit中搜索未使用的类,如何查找MyClass.class引用?

Java 在ArchUnit中搜索未使用的类,如何查找MyClass.class引用?,java,archunit,Java,Archunit,我正在尝试使用进行单元测试,以检查是否有未使用的类。但是我不知道如何检查某个类是否被MyClass.class引用 例如,我有一门课: public class MyClass { ... } 然后我用某种方法引用这个类: public class MySecondClass{ public void methodA(){ methodThatTakesClassAsParameter(MyClass.class); } ... } 如何从Ar

我正在尝试使用进行单元测试,以检查是否有未使用的类。但是我不知道如何检查某个类是否被MyClass.class引用

例如,我有一门课:

public class MyClass {
    ...
}
然后我用某种方法引用这个类:

public class MySecondClass{
    public void methodA(){
        methodThatTakesClassAsParameter(MyClass.class);
    }
    ...
}
如何从ArchUnit中看到MyClass是从MySecondClass中引用的?

我可能会为您提供一个(部分)解决方案

创建一个
ArchCondition

  public static class NotBeUnreferenced extends ArchCondition<JavaClass> {

      NotBeUnreferenced() {
          super("is not referenced by any other compilation units");
      }

      @Override
      public void check(JavaClass javaClass, ConditionEvents events) {
          Set<JavaAccess<?>> accessesFromOtherCompilationUnits = new HashSet<JavaAccess<?>>();
          accessesFromOtherCompilationUnits.addAll(javaClass.getAccessesToSelf());
          accessesFromOtherCompilationUnits.removeAll(javaClass.getAccessesFromSelf());

          if (accessesFromOtherCompilationUnits.isEmpty() && javaClass.getDirectDependenciesToSelf().isEmpty()) {
              String message = createCheckMessage(javaClass, "is unreferenced");
              events.add(new SimpleConditionEvent(javaClass, false, message));
          }
      }

      // taken from com.tngtech.archunit.lang.conditions.ArchConditions
      public static <T extends HasDescription & HasSourceCodeLocation> String createCheckMessage(T object,
              String message) {
          return object.getDescription() + " " + message + " in " + object.getSourceCodeLocation();
      }
  }
  ArchCondition<JavaClass> notBeUnreferenced = new NotBeUnreferenced();
  ArchRule rule = classes().should(notBeUnreferenced);
  collectedRules.add(rule);
你可能想

  • 通过附加or条件(
    rule=rule.or(ArchConditions.beAnnotatedWith(…)
    ),排除带有特定注释的类(例如,
    @EJB
    @依赖的
    @无状态的
  • 从测试类中排除代码
  • 排除仅显示常量的类和接口
已知限制

请注意,如果只有访问权限,则编译单元(类、接口、枚举)被视为未引用

  • 访问
    .class
    和其他反射访问
  • 访问常量(即静态最终字段)

我认为这是github项目中讨论的一个问题,目前还没有解决方案。非常感谢@nrainer;我在这里扩展了您的示例,以检测我的项目中未使用的代码: