Anotaciones de Java

114

¿Cuál es el propósito de las anotaciones en Java? Tengo esta idea borrosa de ellos como algo entre un comentario y un código real. ¿Afectan al programa en tiempo de ejecución?

¿Cuáles son sus usos típicos?

¿Son exclusivos de Java? ¿Existe un equivalente en C ++?

Lehane
fuente
9
Puedes hacer algunas cosas realmente perversas con anotaciones. Por ejemplo, si conoce Spring Framework y su anotación @Transactional que inicia una transacción antes de la invocación del método y retrocede en la excepción / error y se confirma en la transacción exitosa. Apoya totalmente el principio SOC (separación de preocupaciones). Muy limpio ! Reglas de Java! :-)
1
Eso me parecen 3 preguntas. El segundo en sí mismo es demasiado amplio.
Raedwald
Todas las anotaciones por sintaxis parecen interfaces. Entonces, ¿cómo el compilador o JVM conoce su propósito? Supongamos que si tomamos @ Override -> realiza una verificación sobre si el método se reemplaza correctamente o no @ Transactional, como se explicó anteriormente, realiza cosas relacionadas con la transacción. Para todas estas anotaciones, ¿dónde podemos encontrar definición / lógica?
Paramesh Korrakuti

Respuestas:

80

Las anotaciones son utilizadas principalmente por código que inspecciona otro código. A menudo se utilizan para modificar (es decir, decorar o envolver) clases existentes en tiempo de ejecución para cambiar su comportamiento. Los marcos como JUnit e Hibernate usan anotaciones para minimizar la cantidad de código que necesita escribir usted mismo para usar los marcos.

Oracle tiene una buena explicación del concepto y su significado en Java en su sitio.

Anders Sandvig
fuente
17

Además, ¿son exclusivos de Java, hay un equivalente de C ++?

No, pero VB y C # tienen atributos que son lo mismo.

Su uso es bastante diverso. Un ejemplo típico de Java,@Override no tiene ningún efecto en el código, pero el compilador puede usarlo para generar una advertencia (o error) si el método decorado no anula realmente otro método. Del mismo modo, los métodos se pueden marcar como obsoletos.

Luego está la reflexión. Cuando refleja un tipo de clase en su código, puede acceder a los atributos y actuar de acuerdo con la información que se encuentra allí. No conozco ningún ejemplo en Java, pero en .NET el compilador lo usa para generar (des) serialización de información para clases, determinar el diseño de memoria de estructuras y declarar importaciones de funciones de bibliotecas heredadas (entre otras). También controlan cómo funciona el diseñador de formularios IDE.

/ EDITAR: Los atributos de las clases son comparables a las interfaces de etiquetas (como Serializable en Java). Sin embargo, las pautas de codificación de .NET dicen que no se deben usar interfaces de etiquetas. Además, solo funcionan a nivel de clase, no a nivel de método.

Konrad Rudolph
fuente
13

Anders ofrece un buen resumen y aquí hay un ejemplo de una anotación JUnit

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

Aquí, la @Testanotación le dice a JUnit que el flatfileMissingmétodo es una prueba que debe ejecutarse y que el resultado esperado es un lanzamiento IOException. Por lo tanto, cuando ejecute sus pruebas, se llamará a este método y la prueba pasará o fallará en función de si unIOException se lanza una.

Eli Courtwright
fuente
7

Java también tiene la Herramienta de procesamiento de anotaciones (apt) donde no solo creas anotaciones, sino que también decides cómo funcionan estas anotaciones en el código fuente.

He aquí una introducción.

pek
fuente
4

Para ver algunas cosas interesantes que puede hacer con Annotations, consulte mi procesador de anotaciones y anotaciones JavaBean .

Son excelentes para generar código, agregar validaciones adicionales durante su compilación, y también las he estado usando para un marco de mensajes de error (aún no publicado, es necesario aclarar con los jefes ...).

Scott Stanchfield
fuente
1

Por definición literal, una anotación agrega notas a un elemento. Asimismo, las anotaciones de Java son etiquetas que insertamos en el código fuente para proporcionar más información sobre el código. Las anotaciones de Java asocian información con el elemento de programa anotado. Además de las anotaciones de Java, los programas de Java tienen una gran cantidad de documentación informal que normalmente se incluye en los comentarios del archivo de código fuente. Pero, las anotaciones de Java son diferentes de los comentarios, ya que anotan los elementos del programa directamente usando tipos de anotaciones para describir la forma de las anotaciones. Las anotaciones de Java presentan la información de una manera estándar y estructurada para que pueda ser utilizada fácilmente por las herramientas de procesamiento.

Para leer en detalle, hay un buen tutorial sobre anotaciones de Java.

Krishan
fuente
0

Las anotaciones cuando se trata de EJB se conocen como elegir el enfoque de middleware implícito sobre un enfoque de middleware explícito, cuando usa la anotación, está personalizando lo que necesita exactamente de la API, por ejemplo, necesita llamar al método de transacción para una transferencia bancaria : sin usar anotación: el código será

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

mientras usa Annotation, su código no contiene llamadas API engorrosas para usar los servicios de middleware. El código es limpio y se centra en la lógica empresarial.

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
Segador
fuente