7507 10 rtti reflexion

Upload: dofy007

Post on 08-Jul-2015

59 views

Category:

Documents


0 download

TRANSCRIPT

RTTI y reflexin Modelos de datosCarlos Fontela [email protected]

A3F

TemarioRTTI (informacin de tipos en tiempo de ejecucin)Reflexin Modelo de datos y memoria de Java

Otros modelos

1c2010

2

A3F

Transformaciones de tiposTransformacin automticaElipse e = new Elipse();

Figura f = e;

Transformacin explcitaElipse e2 = (Elipse)f; // f.setRadioMayor(3); f es una Elipse, pero...(Elipse)f.setRadioMayor(3);

Se hace chequeo Todo objeto conoce su tipo! El tipo del objeto nunca cambia! Cmo es esto? => RTTI

1c2010

3

A3F

RTTI (1)Hay una clase Class y est ObjectCuando se crea un objeto, se guarda en un atributo de Object una referencia a un objeto ClassEl objeto Class se crea al compilar la clase

1c2010

4

A3F

RTTI (2)Versin no polimorfa:if (f.getClass( ) == Elipse.class) return ((Elipse) f).getCentro( ); if (f.getClass( ) == Class.forName("Elipse")) return ((Elipse) f).getCentro( );

Versin polimorfa:if (x instanceof Elipse) return ((Elipse) f).getCentro( );

C#No polimorfo: GetType() Polimorfo: operador is

1c2010

5

A3F

Reflexin (1)Cosas raras (faltan excepciones):public void metodoRaro (Object o1) throws Exception { Class claseAncestro = o1.getSuperclass();

Object o2 = claseAncestro.newInstance();Method m = o2.getClass().getConstructors()[0]; m.invoke();

}

1c2010

6

A3F

Reflexin (2)RTTI: el compilador debe conocer los tipos

Qu pasa si recibo un objeto por una red?Puedo obtener el objeto Class y preguntar por mtodos, atributos, interfaces, etc.

Paquete java.lang.reflectLa informacin debe estar en tiempo de ejecucin En general se maneja en forma automticaInterrogacin a componentes para saber qu eventos soporta 1c2010 7

A3F

Reflexin (3)ClasesMethod, Constructor, Field

MtodosgetMethods(), getConstructors(), getFields(), getInterfaces(), getSuperclass() newInstance()En clase Field: get() y set() En clase Method: invoke()

Mucho ms1c2010

8

A3F

Un uso de reflexin: creacin de objetosFraccion f = new Fraccion();

La clase est especificada en el cdigo y se conoce en tiempo de compilacin Qu pasara si hicisemos?:Serializable f = x.crearObjeto(); // Serializable es una interfaz

El mtodo podra ser:public Serializable crearObjeto ( ) { String nombreClase = leerArchivoConfiguracion(); Class claseInstanciar = Class.forName(nombreClase); Object nuevo = claseInstanciar.newInstance(); return (Serializable) nuevo; }

Ahora la clase se conoce recin en tiempo de ejecucin1c2010

9

A3F

Reflexin: ya la usamos?Framework JUnitCmo funciona?

Usa polimorfismoMtodos setUp() y tearDown()

Y reflexinMtodos public void testXxx()

Algo bastante comn en todos los frameworks1c2010

10

A3F

EncajonamientoAutoboxing(la traduccin es ma)

Javaint x = 4; Integer i = x; // equivale a Integer i = new Integer(x);

int y = (int) i; // equivale a int y = i.intValue( ); Collection le = new ArrayList( ); le.add(5);

1c2010

11

A3F

Otros lenguajesC#Misma funcionalidad que en Java Encajonamiento con mejor desempeo

Los arreglos primitivos son todos subclases de System.ArrayTodos los tipos por valor heredan de System.ValueType

C++Poca informacin de tipos y sin reflexinDistintas formas de transformaciones de tipos: muy complejo No hay encajonamiento ni todos los tipos son clases1c2010

12

A3F

Malos usos: ojo con RTTICompromete la extensibilidadpublic Punto algunaPosicion ( ) { if (this instanceof Elipse) return ((Elipse) this).getCentro( ); if (this instanceof Poligono) return ((Poligono) this).getContorno( )[0]; throw new IllegalArgumentException( ); }

Evita el polimorfismoif (x instanceof Elipse) ((Elipse)x).dibujar( );

Muy contrario a POO en general1c2010

13

A3F

Malos usos: ojo con reflexinPodemos terminar generando cualquier cosaSndrome del elefante alado

Difcil de testear Difcil de leer No cualquiera la usa bien1c2010

14

A3F

Modelo de memoria de JavaReferenciasOjo con comparaciones== y equals()

Ojo con asignaciones= y clone()

Recoleccin de basuraOjo con acciones finalesfinalize(), System.runFinalization() y System.gc()1c2010

15

A3F

Igualdad e identidadif (a == b)if a.equals(b)

// compara referencias// compara contenido

equals:Est definido en ObjectEst implementado en colecciones

No hace comparaciones profundas

1c2010

16

A3F

Asignacin simpleObject a = b; // asigna referencias Object o, b; o.m(b); // b pasa como referencia int x = y;// asigna valores int y; Object o; o.m(y);1c2010

// y pasa como valor17

A3F

Clonacina = b.clone();

En Object est definido:protected Object clone() throws CloneNotSupportedException{ // hace una copia de bits... }

Hay que redefinir clone como pblico y que llame a super.clone() Si quiero una copia profunda, implementarlaVer ejemplo en libros

Hay que implementar CloneableSi no, obtenemos CloneNotSupportedException1c2010

18

A3F

Recoleccin de basuraNo determinstica Asegura queNo me voy a quedar sin memoria mientras haya objetos sin referenciar No se va a liberar ningn objeto que est siendo referenciado desde un objeto referenciado

Extremadamente cmoda Y evita errores muy difciles de encontrar y reparar

1c2010

19

A3F

Finalizacin: finalize()No es un destructor

Se ejecuta cuando pasa el recolector de basuraNo sabemos cundo

Puede que nuncaNo sabemos nada del orden, como para llamar un finalize() desde otro finalize()

Solucin a medias para liberar recursos1c2010

20

A3F

Liberacin forzadaSystem.gc();JVM hace su mejor esfuerzo por recolectar todo.Lleva mucho tiempo. Puede usarse antes de crear una gran estructura.

System.runFinalization();JVM hace su mejor esfuerzo por finalizar todo, sin recolectar.

Iguales consideraciones.1c2010

21

A3F

C# (1)El modelo es de referencias para clases y otros tiposCon recoleccin automtica de basura Hay destructores, pero es otro nombre para un finalizador Hay mtodos Clone y Equals

Pero tambin sobrecarga de == y !=

1c2010

22

A3F

C# (2)Hay tipos de datos estticosstructs, enums, etc.

Se manejan como en C++Pueden implementar interfaces

Pero no tienen herencia

Hay aritmtica de punterosunsafe, fixed, y otras restricciones

1c2010

23

A3F

Object PascalEl modelo es de referenciasPero hay clases por valor

No hay recoleccin automtica de basuraSe deben crear destructoresEn general son virtuales y se los llama desde un mtodo Free destructor Destroy; virtual;

Hay aritmtica de punterosPor herencia de Borland Pascal1c2010

24

A3F

C++El modelo es estticoPero hay punteros

Existen los destructoresNo necesariamente para liberar memoria

Hay aritmtica de punteros

1c2010

25

A3F

SmalltalkEl modelo es de referencias

Hay recoleccin automtica de basuraEs un lenguaje de tipos dinmicosPolimorfismo automtico

No hay aritmtica de punteros Interpretado

1c2010

26

A3F

ClavesTodo objeto conoce su tipo, y es permanente: RTTI Se le puede preguntar de todo a un objeto: reflexin Usar RTTI y reflexin con medida La clonacin y equals() solucionan problemas de usar referencias finalize(), gc() y runFinalization() proveen sucedneos a medias de los destructores1c2010

27

A3F

Lecturas opcionalesThinking in Java, Bruce EckelCaptulo 4, Initialization & Cleanup Captulo 12, Run-time Type Identification Apndice A, Passing & Returning Objects Est en biblioteca Hay versin castellana

Orientacin a objetos, diseo y programacin, Carlos Fontela 2008Captulo 20 Los datos, los tipos y la memoria

1c2010

28

A3F

Qu sigue

1c2010

29

A3F