Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de...

25

Transcript of Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de...

Page 1: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.
Page 2: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias

₋ Instanciación₋ Manipulación de atributos₋ Invocación de métodos

Sumario

Page 3: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Java posee la capacidad de introspección o “reflection”

Mecanismo para descubrir en tiempo de ejecución la información (meta-datos) relacionada con los atributos, constructores y métodos de una clase

Page 4: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

La API permite:₋ Determinar la clase de un objeto ₋ Obtener información acerca de

₋ Modificadores₋ Atributos₋ Métodos₋ Constructores₋ Superclases.

Descubrir las constantes y declaraciones de métodos de una interface

Page 5: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Situación:₋ A veces es necesario obtener información de una

clase en tiempo de ejecución₋ Ejemplo: class browser

Un objeto de tipo java.lang.Class representa (refleja) una clase.

La JVM mantiene un objeto inmutable de este tipo para cada clase

Page 6: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

En este caso, veremos ejemplos de la creación de objetos de tipo TwoString mediante Reflection.

La clase TwoString esta dada por:

TwoString.javapublic class TwoString {

private String m_s1, m_s2; public TwoString(String s1, String s2) {

m_s1 = s1; m_s2 = s2; }

}

Page 7: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Sobre una instancia (método getClass de Object)

Class c = myObject.getClass();

Superclases₋ ¿Como obtengo el descriptor de la clase

Vehiculo que es superclase de Automovil?

Automovil a = new Automovil();Class c = a.getClass();Class superclase = c.getSuperclass();

Page 8: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Método String getName()

import java.lang.reflect.*;import java.util.*;

public class TestClassName {

public static void main(String[] args) { Date now = new Date(); printClassName(now); }

static void printClassName(Object o) { Class c = o.getClass(); String s = c.getName(); System.out.println(s); }}

Page 9: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

import java.lang.reflect.*;import java.awt.*;public class TestModifiers {

public static void main(String[] args) { String s = new String(); printModifiers(s); }

public static void printModifiers(Object o) { Class c = o.getClass(); int m = c.getModifiers(); if (Modifier.isPublic(m)) System.out.println("public"); if (Modifier.isAbstract(m)) System.out.println("abstract"); if (Modifier.isFinal(m)) System.out.println("final"); }}

Page 10: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

import java.lang.reflect.*;import java.awt.*;

class SampleSuper { public static void main(String[] args) { Button b = new Button(); printSuperclasses(b); }

static void printSuperclasses(Object o) { Class subclass = o.getClass(); Class superclass = subclass.getSuperclass(); while (superclass != null) { String className = superclass.getName(); System.out.println(className); subclass = superclass; superclass = subclass.getSuperclass(); } }}

Page 11: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Método boolean isInterface()

Obtener las constantes primitivas públicas definidas en la interface: Field [] getFields()

Obtener los métodos públicos declarados en la interface: Method [] getMethods()

Page 12: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Como ya hemos dicho antes, los métodos de la API Reflection nos permiten acceder a los campos y métodos públicos (por eso no aparecen email, getNombre y setNombre) y los métodos hashCode, getClass, etc. son métodos de la clase java.lang.Object, de la que hereda nuestra clase.

En este caso, veremos un ejemplo en el cual se obtiene información de una clase como ser: métodos y campos,

Page 13: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

A continuación veremos un ejemplo en el cual utilizaremos algunos de los métodos que nos proporciona la API de Reflection.

Dentro del ejemplo, se crea una instancia de una clase en tiempo de ejecución, se obtiene información de los métodos de dicha clase y atributos

Page 14: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Luego de ejecutar el código del ejemplo anterior, se obtiene:

Lista de campos  nombre Lista de métodos  setEmail getEmail hashCode getClass wait wait wait

equals notify notifyAll toString

Page 15: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Reflection, también nos permite obtener información de los constructores.

A continuación veremos un ejemplo de cómo crear instancias de objetos en tiempo de ejecución, pudiendo seleccionar que constructor utilizar.

Page 16: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Métodos propios y heredadosMethod [] getMethods()

Nuevos métodos declarados en la clase Method [] getDeclaredMethods()

Un objeto de tipo Method puede usarse para obtener:₋ Nombre del método₋ Tipo de retorno₋ Tipos de los parámetros₋ Conjunto de modificadores₋ Conjunto de excepciones declaradas

Page 17: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Propios y heredados₋ Método Field [] getFields()

Los declarados a nivel de la clase₋ Método Field [] getDeclaredFields()

Page 18: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Para usar el constructor sin argumentos₋ Método Object newInstance() de la clase Class

Class c = …;Object o = c.newInstance();

Para usar constructores con argumentos₋ Método Object newInstance() de la clase

Constructor

// Obtengo el constructor Constructor cons = …; Object o = cons.newInstance();

Declaran la excepción NoSuchMethodException

Page 19: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

En el ejemplo anterior, se crea un objeto de tipo constructor2, utilizando el método getConstructor y newInstance.

En este caso, se pasan por parámetro los valores correspondientes para el constructor2 que recibe dos enteros.

Page 20: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Recuperación del valor de un atributo primitivo₋ Métodos getXXX sobre las instancias de la clase

Field₋ Ejemplo (f de tipo Field, obj objeto a consultar):

int i = f.getInt(obj);

Recuperación del valor de un atributo objeto₋ Método get sobre las instancias de la clase Field₋ Ejemplo (f de tipo Field, obj objeto a consultar):

Object i = f.get(obj);

Se aplican las reglas definidas por los modificadores!

Page 21: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Establecer el valor de un atributo primitivo₋ Métodos setXXX sobre las instancias de la clase

Field₋ Ejemplo (f de tipo Field, obj objeto a modificar):

f.setBoolean(obj, true);

Establecer el valor de un atributo objeto₋ Método set sobre las instancias de la clase Field₋ Ejemplo (f de tipo Field, obj objeto a modificar):

f.set(obj, new Date());

Se aplican las reglas definidas por los modificadores!

Page 22: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Invocación de métodos₋ Obtener el objeto Method asociado al método a

invocar₋ Invocar el método Object invoke(Object target,

Object [] args)₋ “target” es la instancia sobre la que se invocará

el método

Page 23: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Se modifica la API de reflection para dar soporte a argumentos variables₋ Class.getMethod₋ Method.invoke₋ Constructor.newInstance₋ Proxy.getProxyClass₋ MessageFormat.format

Page 24: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

Qué es Reflection? Para qué sirve?

java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Modifier java.lang.Object

Page 25: Introducción Características de la API Examinando clases (java.lang.Class) Manipulación de instancias Instanciación Manipulación de atributos Invocación.

The Java TutorialTrail de reflectionhttp://java.sun.com/docs/books/tutorial/index.html