我可以在Java中聚合,代理或模仿@SuppressWarnings吗?

时间:2016-06-10 09:19:30

标签: java spring annotations

我使用Spring构建一个ModelMap,它由Mustache渲染然后解析。出于这个原因,我有一些类只存在为Mustache方便的数据包装。

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

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

我的目标基本上是一种说@SuppressWarnings("unused") // For Mustache的奇特方式。

我尝试使用ForMustache注释@SuppressWarnings("unused"),但其效果适用于我的注释,而不是传播到使用@ForMustache注释的类型。

我可以使用其他注释代理或模仿@SuppressWarnings("unused")吗?

1 个答案:

答案 0 :(得分:2)

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

它也被指定为

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

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

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

@Data
class Foo {
    private final String value;
}

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

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

  • 使用编译器选项
  • 禁用检查
  • 添加公共getter或其他代码,以便使用这些字段(例如使用lombok)
  • 挂钩编译过程。
相关问题