如何在Java中创建自定义注释?

2022-09-03 05:39:30

我想在java中为创建自定义注释。就像我想使用此注释比较两个字符串值,比较后它将返回一个值。DirtyCheckingboolean

例如:我将放置属性。@DirtyCheck("newValue","oldValue")

假设我做了一个接口:

 public @interface DirtyCheck {
    String newValue();
    String oldValue();
 }

我的问题是

  1. 我在哪里创建一个类来创建用于比较两个字符串值的方法?我的意思是,这个注释如何通知我必须调用此方法?
  2. 如何检索此方法的返回值?

答案 1

首先,您需要标记注释是否用于类,字段或方法。假设它是针对方法的:所以你在你的注释定义中写这个:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DirtyCheck {
    String newValue();
    String oldValue();
}

接下来,你必须写一个类,它将使用反射来检查方法是否有注释并做一些工作,例如说如果 和 是否相等:DirtyCheckeroldValuenewValue

final class DirtyChecker {

    public boolean process(Object instance) {
        Class<?> clazz = instance.getClass();
        for (Method m : clazz.getDeclaredMethods()) {
            if (m.isAnnotationPresent(DirtyCheck.class)) {
                DirtyCheck annotation = m.getAnnotation(DirtyCheck.class);
                String newVal = annotation.newValue();
                String oldVal = annotation.oldValue();
                return newVal.equals(oldVal);
            }
        }
        return false;
    }
}

干杯,米哈尔


答案 2

回答第二个问题:注释不能返回值。处理注释的类可以对对象执行某些操作。例如,这通常用于日志记录。我不确定使用注释来检查对象是否脏是否有意义,除非您想在这种情况下抛出异常或通知某种.DirtyHandler

对于你的第一个问题:你真的可以花一些精力自己找到这个。这里有足够多的关于堆栈溢出和网络的信息。


推荐