【问题标题】:Create a Java annotation for warnings - @NonOptimal为警告创建 Java 注释 - @NonOptimal
【发布时间】:2020-08-19 15:07:17
【问题描述】:

@Deprecated 注释有什么特别之处我无法重现吗?

我需要创建一个类似于@Deprecated 的注释以在 Eclipse 中以及在构建时产生警告。当我将方法标记为@Deprecated 时,我会收到很好的警告。例如,如果我有一个旧方法(出于兼容性原因我可能仍然保留):

@Deprecated
public List<Account> getClientAccounts(final int clientId) {
  // Implement search...
}
  • 然后,如果我尝试在 Eclipse 中使用它,我可以看到它带有删除线,并且左侧栏中有一个黄色图标:

  • 在构建时我还可以看到:

    [警告] app1/src/test/java/com/app1/MyApp.java:app1/src/test/java/com/app1/MyApp.java 使用或覆盖了已弃用的 API。

现在,根据我无法控制的外部因素(例如,缺少数据库索引),某些方法不是最佳的,我想用我全新的 @NonOptimal 注释清楚地标记它们。我需要增加对问题的可见性。到目前为止,我有:

@Retention(RUNTIME)
@Target(METHOD)
// What else here?
public @interface NonOptimal {
}

如何创建此注释?

【问题讨论】:

  • 为了做这样的事情,你需要为编译器创建一个注释处理器,例如cloudogu.com/en/blog/Java-Annotation-Processors_1-Intro
  • @jtahlborn 我正在尝试按照链接中的说明进行操作,但编译器说这些类不是 API 的一部分。我得到:Access restriction: The method 'JavaCompiler.CompilationTask.call()' is not API (restriction on required library '/apps/jdk-11+28/lib/jrt-fs.jar')。也许这不再适用于 Java 11。
  • 我相信这是一个 eclipse 限制。您可能需要更改 eclipse 中的一些设置以允许它构建您的项目:stackoverflow.com/questions/25222811/…
  • @jtahlborn 实际上是个不错的选择。我为 Java 11 实现了它,它在构建过程中运行良好。关于另一边(Eclipse 警告、图标等)你有什么指点吗?
  • 对于 Eclipse,两个选项是编写一个 Eclipse 插件,或者运行一个外部构建(即,使用您的注释处理器调用 javac)。前者可以提供更好的 UI 体验,但后者更容易实现,更容易应用于其他 IDE。

标签: java annotations compiler-warnings


【解决方案1】:

我希望我可以延长 Deprecated,但没办法。

在阅读了相当多的内容后,我最终得到了一个丑陋的解决方法。它有效,虽然我不喜欢它。

我决定用@Deprecated@NonOptimal 注释标记坏方法。它在概念上是错误的(这些方法实际上并未被弃用),但它开箱即用。无需开发一个矫枉过正的 Eclipse 插件:

  • @Deprecated 注释错误开发人员到处都是(在 Eclipse 中和构建时),这是一件好事。

  • @NonOptimal 注释提供了详细信息说明为什么这是一种不好的方法。

丑陋但有效。到目前为止,Eclipse 没有提供任何更好的选择。

注意:更糟糕的是,在使用工具链时,NonOptimal 注释在 Maven 中不能很好地工作:警告会静默、消失、nada……因此,AnnotationProcessors 最终有点没用.

【讨论】:

  • 您还需要配置 Maven 以使用您的注释处理器构建并执行它。
【解决方案2】:

@TheImpaler 这实际上不是您问题的真正答案,但前段时间我在使用 Zalando 的问题 API 时遇到了 Google Annotations Library(又名 gag)。

这个库提供了大量的自定义注解,在某些情况下,可以通过使用 ASM 和自定义 Java 代理来检测您的实际代码。

也许它可以给你一些关于你的实际问题的想法。

该项目不再维护,但Github中有一个fork。

【讨论】:

  • 虽然你的回答并没有解决问题,但我还是决定给你赏金,以免浪费。顺便说一句,这些注释非常有趣(有些甚至很有用!)。
  • 非常感谢!!我没想到赏金!你对注释是正确的;如果可能的话,我通常会在我的项目中使用它们。再次感谢您!
猜你喜欢
  • 2018-03-28
  • 2015-09-20
  • 1970-01-01
  • 2017-06-23
  • 2017-09-08
  • 1970-01-01
  • 2013-11-03
  • 2023-03-04
  • 2022-01-06
相关资源
最近更新 更多