我们需要编写一个 checkstyle 自定义检查来验证从某个类 A 直接或间接继承的类的特定条件。是否可以使用 checkstyle API 识别间接继承? 例如,假设我们有:
- C类---扩展--->B类
- B类---扩展--->A类
在这种情况下,通过查找“扩展”标记 (TokenTypes.EXTENDS_CLAUSE
) 并在扩展子句 AST 中查找 B,很容易检查 C 是否是 B 的子类。但是我们怎么知道C也是A的子类呢?
Java反射加上instanceof是唯一的出路吗? (在我们的例子中是 Not desirable,因为我们必须对数千个文件运行检查。)
PMD 或其他静态分析工具是否允许我针对该(间接继承)条件编写自定义检查?
最佳答案
这可以做到,但并不容易,因为 checkstyle 没有 Java 编译器。所以它只能看源文本,分析它的语法树,而不能“理解”它。
因此,您必须从您的 checkstyle 检查中加载该类。
为此,您很可能需要定义自己的类加载器,这样您就可以从比方说您的 eclipse 工作区(或您的源所在的任何其他地方)加载类。
现在您可以简单地调用 instanceof A
瞧瞧!
我不会担心性能。您可以将类文件的 LRU 缓存添加到您的自定义类加载器,这将解决该问题。另外,如果检查在你的IDE中运行,它只需要加载很少的类(直接继承树中的那些),如果它在整个源上运行,它会在晚上运行,不是吗?
由于这个问题已经很老了,如果您需要代码示例,请告诉我。
关于checkstyle - 如何编写涉及间接继承的Checkstyle自定义检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7773022/