java - 如何防止在一个类中出现多个 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(){...}
}
有什么建议吗?
解决方案
实现您的意图的最佳技术(避免此注释的多个实例)将是静态检查,仅仅是因为它可以完成并且会更早地检测到问题。这通过 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; }
}
}
}
跨项目检查会比较麻烦,因为它需要收集项目中的所有类,这不是那么简单。
推荐阅读
- c# - 如何从内存中删除 image.Source
- angular - 使用 mapbog gl js 突出显示(着色)区域取决于 Mapbox 上土地区域的大小
- python - 删除以特定数字开头的行
- android - App.Current.MainPage 上的 NullReferenceException
- c++ - 嗨,我正在努力解决排序问题
- c++ - 我在一个死循环游戏问题中的方法有什么问题?
- python - 从特定日期检索电子邮件
- android - 如何将我的按钮从屏幕顶部向下移动?
- openid-connect - MSAL.Net 能否用于 RPOC 流以获取 Azure B2C 中的 Id 令牌
- javascript - 练习 javascript 并在 if 语句中出现错误