2012-09-04 17 views
12

Chcę utworzyć niestandardową adnotację w języku Java dla DirtyChecking. Tak jak chcę porównać dwie wartości ciągu za pomocą tej adnotacji, a po porównaniu zwróci wartość boolean. Na przykład: wstawię @DirtyCheck("newValue","oldValue") nad właściwościami.Jak utworzyć adnotację niestandardową w języku Java?

Załóżmy Zrobiłem interfejs:

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

Moje pytania są:

  1. Gdzie robię klasę aby utworzyć metodę porównawczą dwóch wartości ciągu? Mam na myśli to, jak ta adnotacja informuje, że tę metodę muszę wywołać?
  2. Jak odzyskać zwracane wartości tej metody?
+0

można opracować lepsze to, czego po? Czy chcesz, aby kompilator rozpoznawał tę adnotację? lub IDE? lub jakiejś konkretnej struktury, z której korzystasz? –

+0

O ile mogę przeczytać na stronie [oracle's website] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html), nie można tworzyć adnotacji metod/funkcji. Są przeznaczone do przechowywania wartości metadanych lub danych, które mogą identyfikować ich cel. –

+0

Dodaję łącze mówiące o [niestandardowej adnotacji z Oracle] (http://www.oracle.com/technetwork/articles/hunter-meta-2-098036.html) – AurA

Odpowiedz

17

Najpierw należy zaznaczyć, czy adnotacja dotyczy klasy, pola lub metody. Powiedzmy, że jest to dla metody: tak piszesz to w definicji adnotacji:

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

Następny musisz napisać powiedzmy DirtyChecker klasę, która będzie używać refleksji, by sprawdzić, czy metoda ma adnotacji i zrobić jakąś pracę na przykład powiedzieć, czy oldValue i newValue są równe:

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

Cheers, Michał

+0

Dzięki Michałowi za poświęcony czas i odpowiedź mam pewne wątpliwości, takie jak: 1 - Załóżmy, że mam adnotację @DirtyCheck (nowaWartość, Stara wartość) Teraz chcę powiedzieć programistce, aby go używał, więc jest to możliwe, że programista użyje tylko ta składnia adnotacji w ich metodzie ustawienia i adnotacji zwróci mi wartość True lub False, aby programiści wiedzieli, że wartości są takie same lub nie. – psisodia

+0

@psisodia Nie wpadłem na twój pomysł, czy mógłbyś podać przykład? – Michal

+0

Załóżmy, że utworzyłem adnotację @DirtyCheck (newValue, oldValue) i jej klasę DirtyChecker.java Kiedy używam tej adnotacji w mojej aplikacji jak- @DirtyCheck ("cześć", "cześć") publiczny boolean porównać() { ... mycode ... } } Chcę wiedzieć, w jaki sposób ta adnotacja odnosi się do metody podanej w mojej DirtyChecker.java – psisodia

2

Aby odpowiedzieć na drugie pytanie: Twój adnotacji nie może zwrócić wartość. Klasa, która przetwarza twoją adnotację, może zrobić coś z twoim obiektem. Jest to zwykle używane do logowania na przykład. Nie jestem pewien, czy użycie adnotacji w celu sprawdzenia, czy obiekt jest brudny jest sensowne, z wyjątkiem tego, że chcesz rzucić wyjątek w tym przypadku lub poinformować o pewnego rodzaju DirtyHandler.

Na pierwsze pytanie: naprawdę możesz poświęcić trochę czasu na znalezienie tego. Tutaj jest wystarczająco dużo informacji na temat stackoverflow i sieci.

1

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

Jak użyć pola adnotacji w Javie?

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 

Reference

Powiązane problemy