代码之家  ›  专栏  ›  技术社区  ›  krismath maasg

如何验证注释只在某些类上使用?

  •  0
  • krismath maasg  · 技术社区  · 6 年前

    假设我有注释 @Annotate 和一个班 A .我怎么检查 @注释 在课堂上使用 A 它的子类只有(可能在编译时)?

    所以,如果我们有:

    /* Example 1 */
    
    public class A {
    
    }  
    
    public class B extends A {
    
    }
    
    public class C {
    
    }
    

    我怎么检查那个班 A 和班级 B 可由注释 @注释 但是阶级 C 不允许(可能导致编译错误)。


    如果我们决定在编译时检查它:

    /* Example 2 */
    
    public class A {
    
    }  
    
    @Annotate
    public class B extends A {
    
    }
    

    实施例2 不会引发编译时错误,因为 @注释 用于的子类 A . 实施例3 但是,会引发编译错误,因为 @注释 不用于的子类 A .

    /* Example 3 */
    
    @Annotate
    public class C {
    
    }
    

    但是,无论如何,在编译时不必检查这一点。我个人认为这样做是有意义的。

    2 回复  |  直到 6 年前
        1
  •  1
  •   mernst    6 年前

    你应该写一个 annotation processor .注释处理器可以生成新的Java文件,并且与您的情况更相关地发布编译时警告。

    通过运行Java编译器,您将在编译时调用它: javac -processor MyProcessor MyFile.java .如果常规javac或注释处理器发出任何警告,则编译失败。

    注释处理器的逻辑特定于 @Annotate 注释并且很简单:只允许在子类的类上进行注释 A .除了上面链接的Oracle文档外,Web上还有许多关于如何编写注释处理器的教程。

        2
  •  1
  •   Dean Xu    6 年前

    您可以使用my checker framework

    只需在注释上添加注释

    目标(类型) @checktype(value=a.class,type=type.extend-all) 仅限public@interface{ }
    
    

    现在,它可以检查是否在a或其子类上进行了注释。

    它将引发编译错误

    • Eclipse快照
        • Maven快照
          • 添加批注@CheckType在你的注释上

            @Target(TYPE)
            @CheckType(value = A.class, type = Type.EXTEND_ALL)
            public @interface OnlyOnA {
            }
            

            现在,它可以检查是否在a或其子类上进行了注释。

            它将引发编译错误

            • Eclipse快照

            enter image description here

            • Maven快照

            enter image description here