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

标签 checkstyle

我们需要编写一个 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/

相关文章:

java - Maven 检查样式作为构建的一部分

java - 从插件: "org.eclipse.jface" when using Checkstyle Plugin调用代码时出现问题

maven-plugin - Maven checkstyle 插件 : Print warnings to console

java - eclipseProject任务会自动将checkstyleNature添加到项目吗?

java - Eclipse Checkstyle 插件中 "allowThrowsTagsForSubclasses"问题的解决方法

sonarqube - 使用 Sonar checkstyle 插件纪念 @SuppressWarnings

plugins - 无法在 NetBeans 中配置 FindBugs、Checkstyle 或 PMD

java - 在 PMD 中使用 JSP 自定义规则

java - Eclipse 中的 Checkstyle 错误 - 无法实例化 Tab 字符

java - 如何使用 Checkstyle 停止 Maven 构建