如何编写涉及间接继承的Checkstyle自定义检查?

时间:2011-10-14 20:09:19

标签: checkstyle

我们需要编写一个checkstyle自定义检查,用于验证直接或间接从某个类A继承的类的特定条件。是否可以使用checkstyle API识别间接继承? 例如,假设我们有:

  • C类---延伸---> B级
  • B级---延伸---> A级

在这种情况下,通过查找“extends”标记(TokenTypes.EXTENDS_CLAUSE)并在extends子句AST中查找B,可以很容易地检查C是否是B的子类。但我们怎么知道C也是A的子类?

Java反射加instanceof是唯一的出路吗? (Not desirable在我们的案例中,因为我们必须对数千个文件进行检查。)

PMD或其他静态分析工具是否允许我使用该(间接继承)条件编写自定义检查?

2 个答案:

答案 0 :(得分:2)

它可以完成,但不容易,因为checkstyle没有Java编译器。因此,它只能查看源文本并分析其语法树,但它无法“理解”它。

因此,您必须在checkstyle检查中加载类。

为此,您很可能需要定义自己的类加载器,以便您可以从您的eclipse工作区(或者来自其他源的工作区)加载类。

现在你可以简单地拨打instanceof A并发出声音!

我不担心性能。您可以将类文件的LRU缓存添加到自定义类加载器,这将解决该问题。此外,如果检查在IDE中运行,它只需要加载很少的类(直接继承树中的类),如果它在整个源上运行,它将在晚上运行,不是吗?

由于这个问题已经很久了,请告诉我你是否需要一个代码示例。

答案 1 :(得分:0)

我们用Java反射解决了这个问题:

Class<?> clazz = Class.forName(ClassA);
if (ClassC.class.isAssignableFrom(clazz)) {
    // Class C is a direct or indirect subclass of ClassA
}

它限制了自定义检查的适用性,因为它仅在ClassA和ClassC位于类路径中时才有效。