16

我想在 java 中为DirtyChecking. 就像我想使用这个注释比较两个字符串值,比较后它会返回一个boolean值。

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

假设我做了一个界面:

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

我的问题是

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

3 回答 3

21

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

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

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

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;
    }
}

干杯,迈克尔

于 2012-09-04T09:11:12.650 回答
2

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

对于您的第一个问题:您确实可以自己花一些精力来找到它。这里有足够的关于 stackoverflow 和 web 的信息。

于 2012-09-04T09:12:09.063 回答
2

CustomAnnotation.java

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
     int studentAge() default 21;
     String studentName();
     String stuAddress();
     String stuStream() default "CS";
}

如何使用 Java 中的 Annotation 字段?

TestCustomAnnotation.java

package annotations;
import java.lang.reflect.Method;
public class TestCustomAnnotation {
     public static void main(String[] args) {
           new TestCustomAnnotation().testAnnotation();
     }
     @CustomAnnotation(
                studentName="Rajesh",
                stuAddress="Mathura, India"
     )
     public void testAnnotation() {
           try {
                Class<? extends TestCustomAnnotation> cls = this.getClass();
                Method method = cls.getMethod("testAnnotation");

                CustomAnnotation myAnno = method.getAnnotation(CustomAnnotation.class);

                System.out.println("Name: "+myAnno.studentName());
                System.out.println("Address: "+myAnno.stuAddress());
                System.out.println("Age: "+myAnno.studentAge());
                System.out.println("Stream: "+myAnno.stuStream());

           } catch (NoSuchMethodException e) {
           }
     }
}
Output:
Name: Rajesh
Address: Mathura, India
Age: 21
Stream: CS

参考

于 2016-12-28T17:56:03.367 回答