2012-09-04 10 views
12

Voglio creare annotazioni personalizzate in java per DirtyChecking. Come voglio confrontare due valori di stringa usando questa annotazione e dopo averlo confrontato restituirà un valore boolean.Come creare annotazioni personalizzate in java?

Ad esempio: inserirò @DirtyCheck("newValue","oldValue") su proprietà.

Supponiamo che ho fatto un'interfaccia:

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

Le mie domande sono:

  1. dove faccio una classe per creare un metodo di confronto per i due valori di stringa? Voglio dire, come questa annotazione notifica che questo metodo devo chiamare?
  2. Come recuperare i valori di restituzione di questo metodo?
+0

Si può elaborare meglio che cosa siete dopo? vuoi che il compilatore riconosca quell'annotazione? o l'IDE? o qualsiasi quadro specifico che stai usando o cosa? –

+0

Per quanto posso leggere dal [sito Web di oracle] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html), non è possibile creare annotazioni con metodi/funzioni. Sono pensati per memorizzare il valore dei metadati o dati che possono identificare il loro scopo. –

+0

Sto aggiungendo un collegamento parlando di [annotazione personalizzata da Oracle] (http://www.oracle.com/technetwork/articles/hunter-meta-2-098036.html) – AurA

risposta

17

Per prima cosa è necessario contrassegnare se l'annotazione è per classe, campo o metodo. Diciamo che è per il metodo: in modo da scrivere questo nella definizione della nota:

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

successivo si deve scrivere diciamo DirtyChecker classe che utilizzerà riflessione per verificare se il metodo ha l'annotazione e fare un po 'di lavoro per esempio dire se oldValue e newValue sono uguali:

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, Michal

+0

Grazie Michal per il tuo tempo e la risposta ho alcuni dubbi come 1-Supponiamo di avere annotazione @DirtyCheck (newValue, OldValue) Ora voglio dire al mio sviluppatore di usarlo così è possibile lo sviluppatore utilizzerà solo questa sintassi di annotazione nel loro Set Method e annotazione restituirà True o False in modo che gli sviluppatori sappiano che i valori sono uguali o meno. – psisodia

+0

@psisodia Non ho capito la tua idea, potresti fornire un esempio? – Michal

+0

Supponiamo di aver creato un'annotazione @DirtyCheck (newValue, oldValue) e la sua classe DirtyChecker.java Quando uso questa annotazione nella mia applicazione come- @DirtyCheck ("ciao", "ciao") public booleano compare() { ... mycode ... } Voglio sapere come questa annotazione si riferisce al metodo indicato nel mio DirtyChecker.java – psisodia

2

Per rispondere alla tua seconda domanda: l'annotazione non può restituire un valore. La classe che elabora la tua annotazione può fare qualcosa con il tuo oggetto. Questo è comunemente usato per la registrazione, per esempio. Non sono sicuro se usare un'annotazione per verificare se un oggetto è sporco ha senso eccetto che tu vuoi lanciare un'eccezione in questo caso o informare un qualche tipo di DirtyHandler.

Per la tua prima domanda: potresti davvero spendere qualche sforzo per trovarlo da solo. Ci sono abbastanza informazioni qui su StackOverflow e sul web.

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

come utilizzare il campo di annotazione in Java?

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

Problemi correlati