2009-09-03 12 views
165

¿Cuáles son las principales áreas en las que podemos usar Anotaciones? ¿Es la característica un reemplazo para la configuración basada en XML?¿Cómo y dónde se utilizan las anotaciones en Java?

+2

cdb, no soy s Si tiene toda la idea de las bondades, tiene un montón de buenas respuestas aquí, y sin ninguna aclaración de lo que le falta o de lo que está buscando específicamente, ha agregado una recompensa. (También hiciste esto aquí: http://stackoverflow.com/questions/1746550/purpose-of-serialization-in-webapplication) – delfuego

+5

De acuerdo, sé que esto es súper antiguo, pero @delfuego: si vas a Dígale al OP que está utilizando recompensas incorrectamente, podría serle de ayuda seguir explicando [cómo usarlas correctamente] (http://meta.stackexchange.com/questions/16065/how-does-the-bounty-system-work) – Pops

+1

[Comprender la anotación de Java personalizada con ejemplos de la vida real] (http://www.singhajit.com/java-custom-annotations/) –

Respuesta

241

anotaciones son meta-meta-objetos que pueden utilizarse para describir otros meta-objetos. Los meta-objetos son clases, campos y métodos. Pedir un objeto para su metaobjeto (por ejemplo, anObj.getClass()) se llama introspection. La introspección puede ir más allá y podemos preguntarle a un metaobjeto cuáles son sus anotaciones (por ejemplo, aClass.getAnnotations). La introspección y las anotaciones pertenecen a lo que se llama reflexión y meta-programación.

Una anotación necesita ser interpretada de una manera u otra para ser útil. Las anotaciones se pueden interpretar en tiempo de desarrollo por el IDE o el compilador, o en en tiempo de ejecución por un marco.

procesamiento de anotación es un mecanismo muy poderoso y puede ser utilizado en una gran cantidad de diferentes maneras:

  • para describir las limitaciones o el uso de un elemento: por ejemplo, @Deprecated, @Override, o @NotNull
  • para describir la "naturaleza" de un elemento, p. @Entity, @TestCase, @WebService
  • para describir el comportamiento de un elemento: @Statefull, @Transaction
  • para describir cómo procesar el elemento: @Column, @XmlElement

En todos los casos, una anotación se utiliza para describen el elemento y aclarar su significado .

Antes de JDK5, la información que ahora se expresa con anotaciones necesitaba almacenarse en otro lugar, y los archivos XML se usaban con frecuencia. Pero es más conveniente usar anotaciones porque pertenecerán al código Java en sí mismo y, por lo tanto, son mucho más fáciles de manipular que XML.

Uso de anotaciones:

  • de documentación, por ejemplo XDoclet
  • Compilación
  • IDE
  • marco de pruebas, por ejemplo, JUnit
  • Contenedor IoC p. como Spring
  • Serialización, p. XML
  • Programación orientada a aspectos (AOP), p. Spring AOP
  • Servidores de aplicaciones, p. Contenedor EJB, servicio web
  • Asignación relacional de objetos (ORM), p. Hibernate, JPA
  • y muchos más ...

... echar un vistazo, por ejemplo, en el proyecto Lombok, que utiliza anotaciones para definir cómo generar equals o hashCode métodos.

43

Hay varias aplicaciones para las anotaciones de Java. En primer lugar, pueden ser utilizados por el compilador (o extensiones del compilador). Consideremos por ejemplo el Anulación anotación:

class Foo { 

    @Override public boolean equals(Object other) { 
     return ...; 
    } 
} 

Ésta es en realidad construida en el JDK de Java. El compilador indicará un error, si algún método está etiquetado con él, que hace no anula un método heredado de una clase base. Esta anotación puede ser útil para evitar el error común, donde tiene la intención de anular un método, pero no lo hace, porque la firma proporcionada en su método no coincide con la firma del método que se anula:

class Foo { 

    @Override public boolean equals(Foo other) { // Compiler signals an error for this one 
     return ...; 
    } 
} 

El próximo JDK7 permitirá anotaciones de cualquier tipo. Ya hay propuestas para utilizar esta característica para las anotaciones del compilador como NotNull, como en:

public void processSomething(@NotNull String text) { 
    ... 
} 

lo que podría permitir que el compilador le advertirá sobre usos indebidos/sin control de las variables y nulos valores.

Otra aplicación más avanzada para anotaciones implica el procesamiento de reflexión y anotación en tiempo de ejecución. Esto es (creo) lo que tenías en mente cuando hablas de anotaciones como "reemplazo de la configuración basada en XML". Este es el tipo de procesamiento de anotación utilizado, por ejemplo, por varios marcos y estándares JCP (persistencia, inyección de dependencia, lo que sea) para proporcionar la información de metadatos y configuración necesaria.

1

Es útil para anotar sus clases, ya sea en el método, clase o nivel de campo, algo sobre esa clase que no está muy relacionado con la clase.

Puede tener sus propias anotaciones, que se usan para marcar ciertas clases solo como uso de prueba. Simplemente podría ser para fines de documentación, o podría aplicarlo filtrándolo durante la compilación de un candidato de lanzamiento de producción.

Puede usar las anotaciones para almacenar metadatos, como en un marco de plugin, por ejemplo, el nombre del complemento.

Es simplemente otra herramienta, tiene muchos propósitos.

14

Las anotaciones son una forma de metadatos (datos sobre datos) añadidos a un archivo fuente de Java. Son ampliamente utilizados por los marcos para simplificar la integración del código del cliente. Un par de ejemplos del mundo real de la parte superior de mi cabeza:

  • JUnit 4 - que añadir la anotación @Test a cada método de prueba que desea el corredor JUnit para funcionar. También hay anotaciones adicionales relacionadas con la configuración de las pruebas (como @Before y @BeforeClass). Todos estos son procesados ​​por el corredor JUnit, que ejecuta las pruebas en consecuencia. Podría decirse que es un reemplazo para la configuración XML, pero las anotaciones son a veces más potentes (pueden usar la reflexión, por ejemplo) y también están más cerca del código al que hacen referencia (la anotación @Test está justo antes del método de prueba, por lo que El propósito de ese método es claro: también sirve como documentación.La configuración XML, por otro lado, puede ser más compleja y puede incluir muchos más datos que las anotaciones.

  • Terracota: utiliza anotaciones y archivos de configuración XML. Por ejemplo, la anotación @Root le dice al tiempo de ejecución de Terracotta que el campo anotado es una raíz y que su memoria se debe compartir entre instancias de máquina virtual. El archivo de configuración XML se utiliza para configurar el servidor y decirle qué clases instrumentar.

  • Google Guice: un ejemplo sería la anotación @Inject, que cuando se aplica a un constructor hace que el motor de ejecución de Guice busque valores para cada parámetro, en función de los inyectores definidos. La anotación @Inject sería bastante difícil de replicar utilizando archivos de configuración XML, y su proximidad al constructor al que hace referencia es bastante útil (imagine tener que buscar en un enorme archivo XML para encontrar todas las inyecciones de dependencia que ha configurado).

Espero que les haya dado una idea de cómo se usan las anotaciones en diferentes marcos.

6

¿Es un reemplazo para la configuración basada en XML ?

no completamente, pero confguración que se corresponde estrechamente con estructuras de código (tales como asignaciones de la APP o de inyección de dependencia en la primavera) a menudo puede ser reemplazado con anotaciones, y es entonces por lo general mucho menos detallado, molesto y doloroso. Prácticamente todos los frameworks notables han hecho este cambio, aunque la configuración XML anterior usualmente permanece como una opción.

+0

Supuestamente las anotaciones pueden eliminar por completo el archivo XML faces-config para JSF. Recorrió este post mientras trataba de averiguar cómo hacerlo ... –

0

Java EE 5 favorece el uso de anotaciones sobre la configuración XML. Por ejemplo, en EJB3 los atributos de transacción en un método EJB se especifican usando anotaciones. Incluso usan anotaciones para marcar POJO como EJB y para especificar métodos particulares como métodos de ciclo de vida en lugar de requerir esa implementación de una interfaz.

2

Frameworks como Hibernate fueron muchas configuraciones/se requiere una gran cantidad de asignaciones de anotaciones.

Tome un vistazo a Hibernate Annotations

+1

Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir las partes esenciales de la respuesta aquí, y proporcione el enlace para referencia. –

2

APP (de Java EE 5) es un excelente ejemplo de la utilización de anotaciones (más). Java EE 6 también introducirá anotaciones en muchas áreas nuevas, como RESTful webservices y nuevas anotaciones para cada una de las antiguas API de Servlet.

Aquí hay varios recursos:

No son solo los detalles de la configuración los que son/pueden ser tomados por las anotaciones, sino que también se pueden usar para controlar el comportamiento. Usted ve esto bien en los ejemplos JAX-RS de Java EE 6.

6

Hay 2 puntos de vista de anotaciones

  1. vista del usuario, la mayor parte del tiempo, las anotaciones de trabajo como un atajo, ahorrar un poco de pulsaciones de teclas, o hacer su programa más legible

  2. vista del proveedor , la vista de anotación del procesador es más de 'interfaz' ponderada, su programa FRENTE a ALGO pero sin implementar explícitamente la interfaz en particular (aquí también la anotación)

p. Ej. en JPA se define algo como

@Entity class Foo {...} 

en lugar de

class Foo implements Entity {...} 

ambos hablan de la misma cosa "Foo es una clase de entidad"

0

Las anotaciones se pueden utilizar como una alternativa a los archivos de configuración externos, pero no puede considerarse un reemplazo completo. Puede encontrar muchos ejemplos donde las anotaciones se han utilizado para reemplazar archivos de configuración, como Hibernate, JPA, EJB 3 y casi todas las tecnologías incluidas en Java EE.

De todos modos, esta no es siempre una buena opción. El propósito de usar archivos de configuración suele ser separar el código de los detalles del entorno en el que se ejecuta la aplicación. En tales situaciones, y sobre todo cuando la configuración se utiliza para asignar la aplicación a la estructura de un sistema externo, las anotaciones no son un buen reemplazo para el archivo de configuración, ya que le permiten incluir los detalles del sistema externo dentro del código fuente de su aplicación. Aquí los archivos externos deben considerarse como la mejor opción; de lo contrario, deberá modificar el código fuente y volver a compilar cada vez que cambie un detalle relevante en el entorno de ejecución.

Las anotaciones son mucho más adecuadas para decorar el código fuente con información adicional que instruye a las herramientas de procesamiento, tanto en tiempo de compilación como en tiempo de ejecución, para manejar clases y estructuras de clase de manera especial. @Override y JUnit's @Test son buenos ejemplos de tal uso, ya explicado en detalle en otras respuestas.

Al final, la regla es siempre la misma: mantener dentro de la fuente las cosas que cambian con la fuente, y mantener fuera de la fuente las cosas que cambian independientemente de la fuente.

1

Se adhiere información adicional sobre el código por (a) comprobación de compilador o (b) análisis de código

**

  • siguientes son las anotaciones incorporadas :: 2 tipos

**

Tipo 1) Anotaciones aplicadas al código de java:

@Override // gives error if signature is wrong while overriding. 
Public boolean equals (Object Obj) 

@Deprecated // indicates the deprecated method 
Public doSomething().... 

@SuppressWarnings() // stops the warnings from printing while compiling. 
SuppressWarnings({"unchecked","fallthrough"}) 

tipo 2) Anotaciones aplicados a otras anotaciones:

@Retention - Specifies how the marked annotation is stored—Whether in code only, compiled into the class, or available at run-time through reflection. 

@Documented - Marks another annotation for inclusion in the documentation. 

@Target - Marks another annotation to restrict what kind of java elements the annotation may be applied to 

@Inherited - Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses). 

**

  • Anotaciones personalizadas ::

** http://en.wikipedia.org/wiki/Java_annotation#Custom_annotations


PARA ENTENDER MEJOR Pruebas a continuación enlace: ELABORAR CON EJEMPLOS


http://www.javabeat.net/2007/08/annotations-in-java-5-0/

0

El propósito de una anotación de Java es simplemente para asociar información con el elemento del programa anotado. Las anotaciones Java se pueden usar como modificadores en cualquier declaración, ya sea paquete, clase (incluidas enumeraciones), interfaz (incluidos tipos de anotación), campo, método, parámetro formal, constructor o variable local.

Las anotaciones Java también se pueden usar en constantes de enum. Tales anotaciones se colocan inmediatamente antes de la constante de enumeración que anotan. Las anotaciones Java se colocan convencionalmente antes que todos los demás modificadores, pero esto no es un requisito; pueden mezclarse libremente con otros modificadores.

Lea en detalle en Java Annotations.

8

Las anotaciones en Java proporcionan un medio para describir clases, campos y métodos. Básicamente, son una forma de metadatos añadidos a un archivo fuente Java, no pueden afectar la semántica de un programa directamente. Sin embargo, las anotaciones se pueden leer en tiempo de ejecución usando Reflection &, este proceso se conoce como Introspection. Luego podría usarse para modificar clases, campos o métodos.

Esta característica, a menudo es explotada por las bibliotecas & SDKs (hibernate, JUnit, Spring Framework) para simplificar o reducir la cantidad de código que un programador haría a menos que trabaje con estas bibliotecas o SDK. Por lo tanto, es justo para decir Annotations and Reflection trabajar de la mano en Java.

También conseguimos limitar la disponibilidad de una anotación que sea en tiempo de compilación o runtime.Below es un ejemplo sencillo en la creación de una anotación de encargo

Driver.java

package io.hamzeen; 

import java.lang.annotation.Annotation; 

public class Driver { 

    public static void main(String[] args) { 
     Class<TestAlpha> obj = TestAlpha.class; 
     if (obj.isAnnotationPresent(IssueInfo.class)) { 

      Annotation annotation = obj.getAnnotation(IssueInfo.class); 
      IssueInfo testerInfo = (IssueInfo) annotation; 

      System.out.printf("%nType: %s", testerInfo.type()); 
      System.out.printf("%nReporter: %s", testerInfo.reporter()); 
      System.out.printf("%nCreated On: %s%n%n", 
        testerInfo.created()); 
     } 
    } 
} 

TestAlpha.java

package io.hamzeen; 

import io.hamzeen.IssueInfo; 
import io.hamzeen.IssueInfo.Type; 

@IssueInfo(type = Type.IMPROVEMENT, reporter = "Hamzeen. H.") 
public class TestAlpha { 

} 

IssueInfo.java

package io.hamzeen; 

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

/** 
* @author Hamzeen. H. 
* @created 10/01/2015 
* 
* IssueInfo annotation definition 
*/ 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface IssueInfo { 

    public enum Type { 
     BUG, IMPROVEMENT, FEATURE 
    } 

    Type type() default Type.BUG; 

    String reporter() default "Vimesh"; 

    String created() default "10/01/2015"; 
} 
2

Where Annotations Can Be Used

Anotaciones se puede aplicar a las declaraciones: declaraciones de clases, campos, métodos y otros elementos del programa. Cuando se utiliza en una declaración, cada anotación a menudo aparece, por convención, en su propia línea.

Java SE 8 Actualización: anotaciones también se pueden aplicar a la utilización de tipos. He aquí algunos ejemplos:

  • Clase de expresión creación de la instancia:

    nuevo @Interned MyObject();

  • Tipo reparto:

    miCadena = (@NonNull String) str;

  • implementa cláusula:

    clase UnmodifiableList implementa @ReadOnly Lista < @ReadOnly T> {...}

  • Lanzado declaración de excepción:

    monitorTemperature vacío() lanza @Critical TemperatureException {...}

Cuestiones relacionadas