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