【问题标题】:Java: How might one go about generating custom compiler warnings for method usages?Java:如何为方法使用生成自定义编译器警告?
【发布时间】:2010-12-12 19:32:27
【问题描述】:

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

(注意这和How to intentionally cause a custom java compiler warning message?类似,但不一样)

谢谢!

【问题讨论】:

  • 您到底想警告什么,您希望消息是什么? @Deprecated 本身怎么不能满足你的需求?
  • @Deprecated 只是误导,仅此而已。想想一些代码检查警告,比如将 null 传递给 varargs 方法。我想警告开发人员,他们调用我们库的方法的方式与正常使用不同。

标签: java compiler-warnings


【解决方案1】:

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

对于这个用例,请查看 Checker Framework 以了解现有检查器(如空值检查器)以及如何创建自定义检查器(或其他类型注释处理器)。

https://checkerframework.org/

我使用这个工具及其捆绑的检查器并且非常喜欢它。

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

【讨论】:

  • 我想我误导了那个例子,但是这个工具太酷了!我肯定会在未来的项目中使用它。谢谢!
【解决方案2】:

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

现在,我将采用一种相当粗略的解决方案,即用冗长的检查异常来打击程序员。虽然它确实使代码混乱,但它也避免了实际分析其意图的复杂性。比如:

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

如果程序员没有按照指示去做,他们的程序的输出可能会出现伪随机错误,因此调试起来相当乏味。虽然这个解决方案肯定不赞成异常处理(包括我自己),但它只是满足了我的需求。

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

如果你有其他想法,我仍然很想听听。

【讨论】:

    【解决方案3】:

    注解处理器在javac中,你可以在OpenJDK中找到源码。但是,它的设计初衷并不是可扩展的。

    您最好使用 FindBugs 或 PMD 之类的代码分析,因为它们旨在扩展,如果某些条件失败,您的构建就会失败。

    【讨论】:

    • 我不同意,注释处理器 api 明确支持此用例。并且至少 FindBugs 只能访问编译后的代码(字节码分析),而 apt 实际上可以与编译进行交互。我会选择 apt。
    • 不,见 javax.annotation.processing
    猜你喜欢
    • 2010-11-28
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多