【问题标题】:How to prevent multiple instances of a Java annotation in a class如何防止在一个类中出现多个 Java 注释实例
【发布时间】:2019-11-16 00:31:27
【问题描述】:

我有一个这样的 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(){...}
}

有什么建议吗?

【问题讨论】:

  • 你可以明确地使用 Refelction 来查看是否有多个方法有异常,你也可以在编译时检查这个medium.com/@jintin/annotation-processing-in-java-3621cb05343a
  • 除非有注解处理器,否则注解无效。所以你必须实现一个处理器——这可以用 @Alex 建议的反射 API 来完成

标签: java annotations


【解决方案1】:

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

但是,鉴于该问题包含 @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; }
        }
    }
}

检查一个项目会比较麻烦,因为它需要收集项目中的所有类,isn't so simple

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2013-02-07
    • 2017-05-08
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多