我们需要编写一个checkstyle自定义检查,用于验证直接或间接从某个类A继承的类的特定条件。是否可以使用checkstyle API识别间接继承? 例如,假设我们有:
在这种情况下,通过查找“extends”标记(TokenTypes.EXTENDS_CLAUSE
)并在extends子句AST中查找B,可以很容易地检查C是否是B的子类。但我们怎么知道C也是A的子类?
Java反射加instanceof是唯一的出路吗? (Not desirable在我们的案例中,因为我们必须对数千个文件进行检查。)
PMD或其他静态分析工具是否允许我使用该(间接继承)条件编写自定义检查?
答案 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位于类路径中时才有效。