Java:如何为方法使用生成自定义编译器警告?

时间:2010-12-12 19:32:27

标签: java compiler-warnings

我一直在做一些注释处理工作,能够警告用户使用某些带注释的方法会非常有用。这基本上是创建@Deprecated注释的自定义版本。我认为一个好的起点可能是@Deprecated的实际注释处理器,但我似乎找不到它。 :_

(请注意,这与How to intentionally cause a custom java compiler warning message?

类似,但不相同

谢谢!

3 个答案:

答案 0 :(得分:2)

  

考虑一些代码检查警告,例如将null传递给varargs方法。

对于此用例,请查看现有检查器的Checker Framework(如nullness检查程序)以及如何创建自定义检查程序(或其他类型的注释处理程序)。

https://checkerframework.org/

我使用此工具及其捆绑的检查程序并非常喜欢它。

如果不确切地知道你的想法,如果一些跳棋已经解决了你的一些想法,我不会感到惊讶。您可以创建一些可插拔类型来解决您的其他想法。至少,它可能会给你一些关于如何或如何不接近你想要做的事情的想法。

答案 1 :(得分:1)

感谢大家的反馈。查看编译器API,它绝对可行(但不是那么简单)。 This article为编译器API提供了良好的开端。我想将来我会考虑编写一个可扩展的规则检查器。顺便说一下,试图劫持@Deprecated注释是行不通的,因为在编译器内部它会与其他“平台注释”一起被删除。

目前,我正在采用相当粗略的解决方案,使用详细的检查异常来对程序员进行大肆攻击。虽然它会使代码混乱,但它也避免了实际分析其意图的复杂性。类似的东西:

try {
    doWork(workUnit, 15, Style.STRICT);
} catch (MakeSureYouOverrodeEverythingYouWantedToFirst warning) {
    ; // will never actually reach here, but you have been warned!
}

如果程序员没有按照指示做,程序的输出可能是伪随机错误的,因此调试相当繁琐。虽然这个解决方案肯定是对异常处理(包括我)的破解,但它只是简单地满足了我的需求。

此外,额外的努力可能会鼓励程序员实际做他们应该做的事情!

如果您有其他想法,我仍然有兴趣听取其他想法。

答案 2 :(得分:-1)

注释处理器在javac中,您可以在OpenJDK中找到源代码。但是,它并非设计成可扩展的。

你最好做的是使用像FindBugs或PMD这样的代码分析,因为这些代码分析旨在扩展,如果某些条件失败,你的构建就会失败。