Está en la página 1de 7

Programando en Java Jubert Prez

Programando en java
Tema 5












Programando en Java Jubert Prez




Contenido:
Anotaciones
Creando una nueva anotacin
Reflexion
Actividades
Ejercicios


















Programando en Java Jubert Prez


Anotaciones (Annotations)
Las anotaciones son un mecanismo para dotar a las clases de Meta informacin o auto
informacin. Estas ya existan en versiones de java anteriores y de hecho se usaban, por
ejemplo para generar el javaDoc (@Deprecated). Pero desde la versin 1.5 (Tiger! oh
yeah) se han convertido en una parte del lenguaje y podemos trabajar con ellas tanto en
tiempo de compilacin como en tiempo de ejecucin.
Anotar una porcin de cdigo nos sirve para procesarla de alguna manera en algn
script, herramienta de despliegue o de diseo, para hacer uso de ellas en un framework,
o por un compilador.
Las anotaciones se pueden trabajar en tiempo de ejecucin. La forma de hacerlo sera
usando el API de reflection, que se ha completado en Java 5 para tener acceso a las
anotaciones.
Java da soporte directo para muy pocas anotaciones, pero tambin da la posibilidad de
crear nuestras propias anotaciones.

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.

@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: anotaciones para anotaciones.

@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.
Programando en Java Jubert Prez

@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.

Creando una nueva anotacin:

package anotaciones;

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)

public @interface InfAnnotation
{
String id();
String descripcion();
}

Esta es la forma de definir una nueva anotacin, note que cada campo de la anotacin
se define como un metodo en java, por otro lado se define esta anotacin como RUNTIME, es
decir que ser tenida en cuenta por la maquina virtual en tiempo de ejecucin, adems es del
tipo FIELD, o sea que es aplicable a campos.

El uso en una clase es como sigue:

package anotaciones;

public class ClienteInf
{
@InfAnnotation (id="myClassId", descripcion = "mydescrip")
private String data;

public String getData()
{
return data;
}

public void setData(String data)
{
this.data = data;
}
}

Obsrvese como la anotacin se utiliza para asociarle al campo data los valores
especificados en la anotacin.

Veamos como podemos extraer los valores de la anotacin, para ello usaremos
reflexin.

package anotaciones;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class AppInf
Programando en Java Jubert Prez

{
public static void main(String[] args)
{
ClienteInf c = new ClienteInf();
c.setData("Dato1");
Field attr [] = c.getClass().getDeclaredFields();
for(int i=0; i<attr.length; i++)
{
Annotation a[] = attr[i].getAnnotations();
System.out.println(a[i]);
System.out.println(attr[i].getName());
}
}
}

Esta aplicacin utiliza reflexin para obtener la definicin de las anotaciones y el campo al cual
aplica, la salida es como sigue:

@anotaciones.InfAnnotation(id=myClassId, descripcion=mydescrip)
data

Reflexion:

La reflexin es comnmente utilizada cuando se quiere examinar o modificar en
tiempo de ejecucin el comportamiento de las aplicaciones. Por ejemplo, sabiendo el nombre
de una clase, podramos saber que propiedades, constructores, o mtodos tiene. Es como
cuando uno obtiene la metadata de una tabla, pero en este caso es la metadata de una clase.
Se puede instanciar objetos, solo con saber el nombre de la clase, o ejecutar sus mtodos en
tiempo de ejecucin.

La reflexin es una tcnica poderosa y puede permitir que las aplicaciones realicen
operaciones que de otro modo sera imposible. Sin embargo, y a pesar de su potencial, es un
API bastante desconocido, sobre todo para los principiantes en el mundo Java.

Veamos un ejemplo.


public class EjemploBean
{
public String nombre = "Keko";
private String email = "keko@miservidor.es";
@SuppressWarnings("unused")
private void setNombre(String s)
{
nombre = s;
}
protected String getNombre()
{
return nombre;
}
public void setEmail(String s)
{
email = s;
}
public String getEmail()
{
return email;
}
}

Ahora veamos la clase con reflexin:
Programando en Java Jubert Prez

import java.lang.reflect.*;

public class EjemploReflection
{
public static void main(String arg[])
{
@SuppressWarnings("rawtypes")
Class clase;
Field campo, campos[];
Method metodo, metodos[];
try
{
// Cargamos la clase
clase = Class.forName("EjemploBean");
// Recorremos los campos
System.out.println("Lista de campos:\n");
campos = clase.getFields();
for (int i=0; i < campos.length; i++)
{
campo = campos[i];
System.out.println("\t" + campo.getName());
}
// Recorremos los metodos
System.out.println("\nLista de metodos:\n");
metodos = clase.getMethods();
for (int i=0; i < metodos.length; i++)
{
metodo = metodos[i];
System.out.println("\t" + metodo.getName());
}
}
catch (ClassNotFoundException e)
{
System.out.println("No se ha encontrado la clase. " + e);
}
}
}

La clase EjemploReflection utiliza el API de reflexin para ejecutar la clase
EjemploBean, en este ejemplo solo se imprimen las propiedades y mtodos que forman la
clase.

La salida de esta clase es como sigue:

Lista de campos:

nombre
email

Lista de metodos:

setNombre
getNombre
setEmail
getEmail
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
Programando en Java Jubert Prez


Actividades:

Desarrolle una aplicacin que posea una clase entidad, esta clase es un mapa de una
tabla de base de datos llamada persona, es decir, posee todos los campos de la tabla, adems
de los mtodos getter() y setter() de cada campo, utilice anotaciones para definir los nombres
de cada campo y decir si es o no una llave primaria en la clase entidad, la anotacin puede ser
llamada ColumnAnnotation, con RetentionPolicy RUNTIME y ElementType igual a FIELD. Luego,
defina una clase que asigne las anotaciones a cada campo de la clase entidad, realice una
bsqueda de un registro de la base de datos y llene la clase con los valores, luego usando
reflexin imprima:

1. el nombre de cada campo
2. si es o no llave primaria
3. su valor

La tabla persona posee:

cedula: (int)
nombre: (String)
apellido: (String)
edad: (int)

Ejercicio nico:

Desarrolle una aplicacin que genere un archivo con extensin .java, el archivo posee
tres propiedades, nombre, apellido y cedula, tambin posee los mtodos getter() y setter(), de
cada campo y un metodo llamado imprimir() que imprime el contenido de cada propiedad.
Utilice la anotacin creada en la actividad anterior para indicarle a cada campo de la clase su
nombre, as como si es o no llave primaria, luego realice una clase que utilice reflexin y
permita ejecutar el archivo generado, asignarle valores a cada campo ejecutando el metodo
setter() correspondiente e imprimir el registro de datos suministrado a travs del metodo
imprimir(), el programa tambin debe imprimir los valores asignados a las anotaciones.

También podría gustarte