我使用 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") 吗?

最佳答案

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

它也被指定为

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

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

如果有足够的时间,您可以构建一个注释处理器,在编译时将自定义 @ForMustache 注释转换为 @SuppressWarnings,以便编译器可以接收它。以类似的方式 Lombok 可以转动
@Data
class Foo {
    private final String value;
}

a) 编译并且不会提示没有分配给 final 字段的代码和 b) 它不会生成警告,因为它会为该字段生成一个公共(public) getter。这些只能被假定使用/它们可以从编译器无法到达的地方使用。

除了将 @SuppressWarnings 放在任何地方之外,您唯一的机会就是删除导致警告的条件。
  • 使用编译器选项禁用检查
  • 添加公共(public) getter 或其他代码,以便使用字段(例如 lombok)
  • 钩子(Hook)进入编译过程。
  • 10-06 16:11