首页 > 解决方案 > 如何防止在一个类中出现多个 Java 注释实例

问题描述

我有一个像这样的 Java 注释类型:

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Retention(RUNTIME)
@Target(METHOD)
public @interface Foo {

}

我的意图是避免此注释的多个实例。换句话说,我想禁止下一个示例代码并抛出异常:

public class FooTest {
   @Foo
   public void method1(){...}
   @Foo
   public void method2(){...}
}

有什么建议吗?

标签: javaannotations

解决方案


实现您的意图的最佳技术(避免此注释的多个实例)将是静态检查,仅仅是因为它可以完成并且会更早地检测到问题。这通过 Java 的注解处理特性得到支持。

但是,该问题也表明希望在运行时执行此操作,因为它包含@Retention(RUNTIME)并提到了异常。如果事先知道要检查的类列表,则可以通过反射轻松完成此操作。这是检查一个类的简单代码,因为问题提到检查单个类。

public static void checkClass(Class<?> clazz) {
    boolean used = false;
    for( Method method : clazz.getDeclaredMethods() ) {
        if( method.getAnnotation(Foo.class) != null ) {
            if( used ) { 
                throw new IllegalFooUseException(); 
            }
            else { used = true; }
        }
    }
}

跨项目检查会比较麻烦,因为它需要收集项目中的所有类,这不是那么简单


推荐阅读