2012-09-04 23 views
12

Quiero crear una anotación personalizada en java para DirtyChecking. Al igual que quiero comparar dos valores de cadena utilizando esta anotación y después de compararlo devolverá un valor de boolean.Cómo crear una anotación personalizada en java?

Por ejemplo: pondré @DirtyCheck("newValue","oldValue") sobre las propiedades.

Imagínese que hiciera una interfaz:

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

Mis preguntas son:

  1. donde hago una clase para crear un método para la comparación de dos valores de cadena? Quiero decir, ¿cómo esta anotación notifica que tengo que llamar a este método?
  2. ¿Cómo recuperar los valores de devolución de este método?
+0

¿Puede explicar mejor lo que está después? ¿Quieres que el compilador reconozca esa anotación? o el IDE? o cualquier marco específico que está utilizando o qué? –

+0

Por lo que puedo leer en [el sitio web de Oracle] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html), no puede hacer que las anotaciones tengan métodos/funciones. Están destinados a almacenar el valor de metadatos, o datos que pueden identificar su propósito. –

+0

Estoy agregando un enlace que habla de [anotación personalizada de Oracle] (http://www.oracle.com/technetwork/articles/hunter-meta-2-098036.html) – AurA

Respuesta

17

Primero debe marcar si la anotación es por clase, campo o método. Digamos que es para el método: por lo que escribir esto en la definición de anotación:

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

siguiente que tiene que escribir digamos DirtyChecker clase que utilizar la reflexión para comprobar si el método tiene anotación y hacer un poco de trabajo, por ejemplo, decir si oldValue y newValue son iguales:

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

Gracias Michal por su tiempo y la respuesta Tengo algunas dudas como 1-Supongamos que tengo anotación @DirtyCheck (newValue, OldValue) Ahora voy a querer decirle a mi desarrollador que lo use así que es posible que el desarrollador use solo esta sintaxis de anotación en su método de configuración y anotación me devolverá verdadero o falso para que el desarrollador sepa que los valores son los mismos o no. – psisodia

+0

@psisodia No entendí tu idea, ¿podrías dar un ejemplo? – Michal

+0

Supongamos que he creado una anotación @DirtyCheck (newValue, oldValue) y su clase DirtyChecker.java Cuando uso esta anotación en mi aplicación como- @DirtyCheck ("hello", "hola") public boolean compare() { ... mycode ... } Quiero saber cómo esta anotación se refiere al método dado en mi DirtyChecker.java – psisodia

2

Para responder a su segunda pregunta: ¿su anotación no puede devolver un valor. La clase que procesa tu anotación puede hacer algo con tu objeto. Esto se usa comúnmente para el registro, por ejemplo. No estoy seguro si el uso de una anotación para comprobar si un objeto está sucio tiene sentido, excepto que desea lanzar una excepción en este caso o informar algún tipo de DirtyHandler.

Para su primera pregunta: realmente podría gastar un poco de esfuerzo en encontrar esto usted mismo. Aquí hay suficiente información sobre stackoverflow y la 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"; 
} 

Cómo utilizar el campo de la anotación en 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

Cuestiones relacionadas