Reflexe jako introspekce Soubory typu class vznikl kompilac
Reflexe jako introspekce Soubory typu. class vzniklé kompilací tříd a interfejsů obsahují dostatek informací o sobě samých. To umožňuje reflexi v čase běhu ( bez znalosti zdrojových souborů ) zjišťovat: - strukturu programů a balíčků, - hodnoty atributů objektů a měnit je, - dostupné metody a konstruktory a volat je, - třídy a interfejsy a dynamicky vytvářet třídy a instanciovat je, - anotace - parametry (v. 1. 8) Tyto kejkle podporuje třída java. lang. Class a balíček java. lang. reflect. Viz též: http: //java. sun. com/docs/books/tutorial/ http: //www. j 2 ee. me/docs/books/tutorial/reflect/ http: //java. sun. com/developer/technical. Articles/ALT/Reflection/ http: //www. roseindia. net/java/reflect/ PJV 25 1
java. lang. reflect java. lang Type. Variable <D> Annotated Element Package java. lang Type Class Parameter <T> Generic Array. Type Parametrized Type Proxy 1. 8 Accessible Object Generic Declaration Wildcard. Type Executable Constructor Array Method Modifier 1. 8 Member Field java. io. Serializable PJV 25 2
Annotated Element Annotated Type java. rmi java. security Remote Guard java. rmi. server Remote Object 1. 8 Annotated Array. Type java. rmi. server 1. 8 Annotated Parametrized. Type Annotated Wildcard. Type Annotated Type. Variable Remote. Object Invocation Handler java. security Permission java. security Basic Permission 1. 8 Invocation Handler java. beans 1. 8 Reflect Permission Event Handler java. io. Serializable PJV 25 3
Třída java. lang. Class Ke každému typu ( i primitivnímu i poli ) existuje v runtime právě jeden popisný objekt ( tzv. class-object ). Tyto objekty jsou typu Class< typ > a jsou odvozeny z třídy Class. Tato třída oplývá jak testy is***, tak getry get*** k získání informací o typu, struktuře a členech typů. Getry vracejí typy: • Constructor[ ], Method[ ], Field[ ], Interface[ ], Class[ ], Annotation[ ], Enum. Constants, Signers, Type. Parameters, Package buď jen deklarované ve zkoumaných typech anebo i všechny zděděné. • Constructor, Method, Field, Interface, Class, Annotation specificky dle požadovaného jména resp. signatury • Dále lze zjistit superclass, loader, package, modifikátory, typy polí ( i primitivních ) a indikovat různé typy v čase běhu. PJV 25 4
Třída java. lang. Class Další zajímavé metody: static Class<? > for. Name( String name, boolean init, Class. Loader loader ) - zavede třídu do paměti (pokud tam dosud není) a event. ji inicializuje. T new. Instance( ) - instanciuje třídu tj. vytvoří a vrátí objekt. Pro testy is***: Annotation, Annonymous. Class, Array, Assignable. From, Enum, Instance, Interface, Local. Class, Member. Class, Primitive, Synthetic. Metody hash. Code, clone a equals jsou dědictvím java. lang. Objectu. PJV 25 5
Class-objekty Class<Object> get. Class( ), to. String( ) Class<Main> Class<? > to. String( ) Class<Z> def. methods is*** PJV 25 public static void main stack Z z = new Z( ); Class c 1 = z. get. Class( ); Class c 2 = Z. class; c 2 c 1 z Z objekt 6
Proxy čili zástupce Nechat se zastupovat lze i ve virtualitě. Třída java. lang. reflect. Proxy má jen konstruktor: protected Proxy( Invocation. Handler h ) a jen public static metody: Invocation. Handler get Invocation. Handler( Object proxy ) Class get. Proxy. Class( Class. Loader clo, Class … interfaces ) boolean is. Proxy. Class( Class cla ) Object new. Proxy. Instance( ) ( Class. Loader clo, Class[ ] interfaces, Invocation. Handler h ) PJV 25 7
java. lang. reflect Invocation. Handler java. lang. Object all final methods: java. io Serializable get. Class, notify. All, 3 x wait My. Handler My. Interface 4 static methods sun. com. proxy invocation handler object Proxy Class[ ] public final proxy object $Proxy 0 Proxy. A sun. com. proxy public final interfaces $Proxy 0 3 instant methods: hash. Code equals, to. String value object + from interfaces methods, fields extends PJV 25 implements refers 8
- Slides: 8