【问题标题】:Can I aggregate, proxy, or imitate @SuppressWarnings in Java?我可以在 Java 中聚合、代理或模仿 @SuppressWarnings 吗?
【发布时间】:2016-06-10 09:19:29
【问题描述】:

我使用 Spring 构建了一个 ModelMap,它被渲染然后由 Mustache 解析。出于这个原因,我有一些类仅用于包装数据以方便 Mustache。

这些类具有从未在代码中使用的字段和方法,但实际上由 Spring(以及反过来,Mustache)使用。我想通过使用如下所示的自定义注释@ForMustache 对类进行注释来明确声明这是故意的:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface ForMustache {
}

我的目标基本上是一种花哨的说法@SuppressWarnings("unused") // For Mustache

我试图用@SuppressWarnings("unused") 注释ForMustache,但它的效果应用在我的注释中,而不是传播到用@ForMustache 注释的类型。

我可以用另一个注解代理或模仿@SuppressWarnings("unused")吗?

【问题讨论】:

  • 不,这些注释是为编译器设计的,它只会将它们逐字应用到它们所在的元素上。但也许有办法不触发该警告。
  • This question 与您正在尝试做的事情密切相关(您只是想创建一个只包含一个注释而不是多个注释的元注释)。这甚至可能是该问题的重复。
  • @zapl 感谢您的提示,我会尝试调查!
  • @JonK 不,我认为不是,因为 SuppressWarnings 的性质。此外,注释是由 Spring 处理的,所以我可以使用“元注释”。

标签: java spring annotations


【解决方案1】:

@SuppressWarnings 注释适用于直接处理源文件的编译器和其他编译时工具。

也被指定为

@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings { ...

意味着它在运行时不应该再可用。这意味着即使 springs 元注释感知处理也看不到它了。

如果有足够的时间,您可以构建一个注解处理器,在编译期间将自定义的@ForMustache 注解转换为@SuppressWarnings,以便编译器可以拾取它。类似的Lombok可以转

@Data
class Foo {
    private final String value;
}

进入 a) 编译的代码并且不会抱怨没有分配给 final 字段,并且 b) 它不会生成警告,因为它会为该字段生成一个公共 getter。这些只能被假定为使用/它们可以在编译器范围之外的地方使用。

除了将@SuppressWarnings 放在任何地方之外,您唯一的机会是删除导致警告的条件。

  • 使用编译器选项禁用检查
  • 添加公共 getter 或其他代码,以便使用字段(以 lombok 为例)
  • 挂钩到编译过程。

【讨论】:

  • 很好的答案!我确实考虑过编写注释处理器的选项,但是对于这个目标来说似乎付出了太多的努力。非常感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多