Sie sind auf Seite 1von 5

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com Metadatos, (no lo hacamos con XDoclet?) .

Si, es cierto, pero ahora, con la ltima versin de Java (Tiger), tenemos la posibilidad de darle ms flexibilidad a nuestro cdigo, y con un soporte directo de la mquina virtual, sin necesidad de toda una librera externa (esta parte no es del todo cierta). Bsicamente, Java da soporte directo para muy pocas annotations, pero tambin da la posibilidad de crear nuestras propias anotaciones. Es esto lo que voy a hacer para demostrar como funciona.

Primero, un poco de detalle acerca de las annotations:


Definicin (oficial del The Java Tutorial): Las Annotations proveen de informacin acerca de un programa que no es parte del programa. No tienen efecto directo en las operaciones definidas por el cdigo.

Bsicamente, tenemos 2 tipos de anotaciones:


1. Anotaciones Simples, las ms bsicas de todas, son aplicables a casi cualquier tipo de elemento dentro de nuestro cdigo. Dentro de este tipo de anotaciones, podemos encontrar: @Override: Le indica al compilador que el mtodo al cual hace referencia, debe sobrescribir al mtodo de la superclase. Si el desarrollador no lo especifica de la misma forma en que est definido en la clase padre, el compilador se va a quejar. @Deprecated: Mucho mejor que especificarlo en los JavaDocs, podemos marcar a un mtodo como desacralizado y hacer que el mismo compilador le avise a cualquier usuario de nuestra clase. @Suppresswarnings: Es casi auto explicativo, lo que hace es decirle al compilador que no muestre cualquier tipo de warning.

2. Meta-anotaciones: para decirlo fcil, anotaciones para anotaciones. Dentro de este tipo de anotaciones, podemos encontrar: @Target: cuando desarrollamos una nueva anotacin, deberemos especificarle a qu tipo de elemento del cdigo es aplicable. De esta manera, podemos acceder a los tipos por medio de constantes definidas en la clase ElementType. @Retention: con esta anotacin especificamos el tiempo de vida que va a tener nuestra nueva anotacin. Por ejemplo: RetentionPolicy.SOURCE indica que la anotacin slo debe ser visible para el cdigo fuente e ignorada por el compilador y la mquina virtual, RetentionPolicy.CLASS es tenida en cuenta por el compilador pero ignorada por la mquina virtual, y RetentionPolicy.RUNTIME va a ser tenida en cuenta por la mquina virtual en tiempo de ejecucin. @Documented: indica que la anotacin a la que hace referencia deber ser tomada en cuenta por la herramienta JavaDoc. @Inherited: por defecto, cuando a una clase la marcamos con una anotacin personalizada, todas las clases hijas no heredarn la anotacin, a menos que marquemos a la anotacin como @Inherited. Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Ahora, vamos directo al grano:


El ejemplo que voy a desarrollar es bastante sencillo. Lo que trataremos de hacer es que una aplicacin utilice la librera de Reflection para poder acceder a las annotations de un objeto determinado. La mayor complejidad radica en utilizar la librera de Reflection. Primero, veamos el cdigo de mi nueva annotation: ColumnAnnotation: import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ColumnAnnotation { String colName(); boolean isPK() default false; } Algunas consideraciones: Necesito importar java.lang.annotation.*; para poder acceder a las meta-anotaciones, en esta caso, para acceder a @Retention. La Annotation @Retention(RetentionPolicy.RUNTIME) especifica que la anotacin ColumnAnnotation tiene que perdurar y poder ser accedida en tiempo de ejecucin. La Annotation @Target(ElementType.FIELD) indica que nuestra anotacin slo va a estar disponible para atributos de clase nicamente. Todas la anotaciones que escribamos deben declararse como @interface No hace falta que declaremos mtodos pblicos, por defecto slo pueden ser public o abstract. Generalmente declaramos a cada uno de los parmetros que la anotacin puede tener como declarramos un mtodo. De hecho, cuando la utilicemos, vamos a ver que cada uno de los mtodos declarados se toma como un parmetro. Podemos marcar uno de los mtodos como opcional, poniendo un valor de defecto, esto se escribe antes del ;, utilizando la palabra reservada default.

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Ahora, la clase Cliente, que ser la que contenga nuestra anotacin:


public class Cliente { @ColumnAnnotation(colName="TID", isPK=true) private int id; @ColumnAnnotation(colName="TNOMBRE") private String nombre; @ColumnAnnotation(colName="TAPELLIDO") private String apellido; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getApellido() { return apellido; } public void setApellido(String apellido) { this.apellido = apellido; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } } Consideraciones: En el cdigo no lo muestro, pero deberamos hacer el correspondiente import para acceder al paquete donde se encuentra nuestra annotation. Las anotaciones, sean a medida o las estndar de Java, siempre comienzan con @. En nuestro ejemplo, vamos a restringir la anotacin nicamente para atributos. Cada uno de los mtodos declarados en la anotacin que no tengan un valor por defecto, deben pasarse como parmetro a la anotacin cuando es utilizada. Para ello se toma el nombre del mtodo como si fuera una variable ms, y se iguala el valor deseado simplemente. Noten que se debe respetar tambin el tipo de dato de cada parmetro.

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Por ltimo, la aplicacin (en este caso una aplicacin de consola)


import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Aplicacion { public static void main(String[] args) { Cliente c = new Cliente(); c.setId(25); c.setNombre("Juan"); c.setApellido("Perez"); Field attr [] = c.getClass().getDeclaredFields(); for(int i=0; i<attr.length; i++){ Annotation a[] = attr[i].getAnnotations(); for(int j=0; j<a.length; j++){ System.out.println(a[j]); System.out.println("Nombre de columna: "+ ((ColumnAnnotation) a[j]).colName()); try { String nombre = attr[i].getName(); nombre = String.valueOf( nombre.charAt(0)).toUpperCase()+ nombre.substring(1); Method getter = c.getClass().getMethod("get"+nombre); String value = getter.invoke(c, new Object[0]).toString(); System.out.println("Valor del campo: "+value); }catch(Exception e) { e.printStackTrace(); } } } } } Unas ltimas consideraciones: Mil disculpas por el ltimo cdigo, recuerden que es a modo explicativo nicamente!!!! Lo que hago bsicamente es crear una instancia un objeto de la clase Cliente y setear sus propiedades. A continuacin, utilizo Reflection para poder acceder al objeto desde Java. Lo interesante de esto es que uso Reflection para hacerlo ms general, recuerden que no necesariamente conozco el objeto, su clase y sus mtodos. Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com Simplemente itero por cada uno de los atributos de la clase y por sus anotaciones, el resultado final debe ser un listado de todas la anotaciones, sus parmetros y el valor del campo. Con esto, podra generar tranquilamente una sentencia SQL y tengo un ORM!!!

Fuentes adicionales: The Java Tutorial (http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html) Tutorial de www.developer.com (http://www.developer.com/java/other/article.php/3556176) Java World An annotation based persistence framework (http://www.javaworld.com/javaworld/jw-03-2005/jw-0321-toolbox.html) http://mundojava.blogspot.com

Ultra mini Tutorial bajado desde http://mundojava.blogspot.com

Das könnte Ihnen auch gefallen