Download Annotaciones en java - Profesores
Document related concepts
no text concepts found
Transcript
Java Annotations Rubby Casallas Grupo de Construcción de Software Universidad de los Andes 1 Referencias http://www128.ibm.com/developerworks/java/library/jannotate1/ http://download.oracle.com/javase/1,5.0/docs /guide/language/annotations.html 2 Meta-Data Meta-data es “data about data” Existe desde Java 5.0 Mecanismo para adicionar anotaciones Anotaciones son modificadores que se pueden adicionar al código y aplicarlos sobre declaraciones de tipos, constantes, métodos, atributos, etc. Existen anotaciones predefinidas y tipos de anotaciones definidas por el desarrollador Java 5.0 ofrece un mecanismo para acceder a las anotaciones vía introspección 3 Meta-Data Información adicional (anotaciones) atadas a los elementos de un programa (atributos, métodos, clases, etc.). Ejemplo: Xdoclet // @ejb.name = Task La semántica de las anotaciones puede ser desde documentación hasta cambiar el comportamiento del método. 4 Para qué sirve? Documentación: Verificaciones en el momento de la compilación: ejemplo: Verificar consistencia entre métodos o clases Análisis de código ejemplo: javadoc, @uml ejemplo: xdoclet Guiar y mejorar la generación de código 5 Conceptos Básicos Marker annotations: No tienen variables Se identifican por un nombre No incluye información adicional Ejemplo: @MarkerAnnotation 6 Conceptos Básicos Single-value annotations: Parecidas a las marcas Proveen una información simple Ejemplo: @SingleValueAnnotation("my data") 7 Conceptos Básicos Full annotations: Tienen atributos y valores Ejemplo: @FullAnnotation(var1="data value 1", var2="data value 2", var3="data value 3") 8 Conceptos Básicos @TODOItems({ // Arreglo de anotaciones @TODO( severity=TODO.CRITICAL, item="Add functionality to calculate ..”, assignedTo="Brett McLaughlin" ), @TODO( severity=TODO.IMPOTANT, item="Print usage message to screen ..”, assignedTo="Brett McLaughlin" ), @TODO( severity=TODO.LOW, item="Roll a new website page with... ”, assignedTo="Jason Hunter" ) }) 9 Anotaciones Predefinidas Override annotation Deprecated annotation SuppressWarnings annotation 10 Override annotation Solo se puede utilizar en métodos Es equivalente a un comentario que indica que el método anotado sobrecarga el método de la superclase. La diferencia con el comentario e squ eel compilador ahace un chequeo 11 package com.oreilly.tiger.ch06; public class OverrideTester { public OverrideTester() { } @Override public String toString() { return " [Override Tester Implementation]"; } @Override public int hashCode() { return toString().hashCode(); } } 12 Deprecated annotation package com.oreilly.tiger.ch06; public class DeprecatedClass { @Deprecated public void doSomething() { // some code } public void doSomethingElse() { // This method presumably does what doSomething() does, but better } } 13 SuppressWarnings annotation Útil en versiones de java que no soportan ciertos nuevos hechos. Por ejemplo generics. @SuppressWarnings(value={"unchecked"}) public void nonGenericsMethod() { List wordList = new ArrayList(); // no typing information on the List wordList.add("foo"); // causes error on list addition } 14 Anotaciones definidas por el desarrollador Definición: package com.oreilly.tiger.ch06; public @interface TODO { public enum Severity { CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION }; Severity severity() default Severity.IMPORTANT; String item(); String assignedTo(); String dateAssigned(); } 15 Anotaciones definidas por el desarrollador Utilización: @TODO( item="Figure out the amount of interest per month", assignedTo="Brett McLaughlin", dateAssigned="08/04/2004" ) public void calculateInterest(float amount, float rate) {} 16 Anotaciones sobre anotaciones Definiendo sobre cuál elemento del lenguaje va la anotación: package java.lang.annotation; public enum ElementType { TYPE, // Class, interface, or enum (but not annotation) FIELD, // Field (including enumerated values) METHOD, // Method (does not include constructors) PARAMETER, // Method parameter CONSTRUCTOR, // Constructor LOCAL_VARIABLE, // Local variable or catch clause ANNOTATION_TYPE, // Annotation Types (meta-annotations) PACKAGE // Java package } 17 Anotaciones sobre anotaciones @Target({ ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.ANNOTATION_TYPE}) public @interface TODO { String value(); } 18 Retención de las anotaciones Se puede decidir: Que el compilador procese las anotaciones pero no las incluya en el bytecode Que las anotaciones se queden en el bytecode Que las anotaciones se puedan utilizar en tiempo de ejecución package java.lang.annotation; public enum RetentionPolicy { SOURCE, // Annotation is discarded by the compiler CLASS, // Annotation is stored in the class file, but ignored by the VM RUNTIME // Annotation is stored in the class file and read by the VM } 19 Retención de las anotaciones Definición de la política para una anotación: @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings {// body } 20 Javadoc de las anotaciones package com.oreilly.tiger.ch06; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Documented @Retention(RetentionPolicy.RUNTIME) public @interface InProgress { } 21 public class Account { ... @Transactional(kind=Required) public void credit(float amount) { ... } @Transactional(kind=Required) public void debit(float amount) { ... } public float getBalance() { ... } ... } pointcut execution( @Transactional * *.*(..)); Por ahora el lenguaje no permite utilizar propiedades de las anotaciones para definir los pointcuts: pointcut execution(@Transactional(kind==RequiredNew) *.*(..)) 22 pointcut transactedOps(Transactional tx) : execution(@Transactional * *.*(..)) && @annotation(tx); Object around (Transactional tx) : transactedOps(tx) { if (tx.value() == Required) { // implement the required transaction behavior } else if(tx.value() == RequiredNew) { // implement the required-new transaction // behavior } ... } 23 Utilización de AOP para suministrar Anotaciones declare annotation : * Account.*(..) : @Authenticated(permission="banking"); 24