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.j2ee.me/docs/books/tutorial/reflect/ http://java.sun.com/developer/technicalArticles/ALT/Reflection/ http://www.roseindia.net/java/reflect/ PJV25
java.lang.reflect Class Array Package Proxy Type Field Method Modifier java.rmi java.lang Package TypeVariable Annotated Element <D> java.lang Class Parameter Proxy Type <T> 1.8 Generic ArrayType Accessible Object Generic Declaration Parametrized Type WildcardType Executable Constructor Array 1.8 Field Method Modifier Member java.io.Serializable PJV25
Event Handler Annotated Reflect Permission PJV25 Remote Guard java.rmi java.security Remote Guard Annotated Element java.rmi.server java.security Remote Object Permission Annotated Type 1.8 Annotated ArrayType java.rmi.server java.security 1.8 RemoteObject Invocation Handler Basic Permission Annotated ParametrizedType 1.8 Annotated WildcardType Invocation Handler Reflect Permission 1.8 Annotated TypeVariable java.beans 1.8 Event Handler java.io.Serializable PJV25
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[ ], EnumConstants, Signers, TypeParameters, 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. PJV25
Třída java.lang.Class Další zajímavé metody: static Class<?> forName( String name, boolean init, ClassLoader loader ) - zavede třídu do paměti (pokud tam dosud není) a event. ji inicializuje. T newInstance( ) - instanciuje třídu tj. vytvoří a vrátí objekt. Pro testy is***: Annotation, AnnonymousClass, Array, AssignableFrom, Enum, Instance, Interface, LocalClass, MemberClass, Primitive, Synthetic. Metody hashCode, clone a equals jsou dědictvím java.lang.Objectu. PJV25
public static void main Class-objekty Class<Object> getClass( ), toString( ) Class<Main> Class<?> toString( ) Class<Z> def. methods is*** public static void main stack Z Z z = new Z( ); Class c1 = z.getClass( ); Class c2 = Z.class; c2 c1 z objekt PJV25
Proxy čili zástupce Nechat se zastupovat lze i ve virtualitě. Třída java.lang.reflect.Proxy má jen konstruktor: protected Proxy( InvocationHandler h ) a jen public static metody: InvocationHandler get InvocationHandler( Object proxy ) Class getProxyClass( ClassLoader clo, Class … interfaces ) boolean isProxyClass( Class cla ) Object newProxyInstance( ) ( ClassLoader clo, Class[ ] interfaces, InvocationHandler h ) PJV25
java.lang.reflect $Proxy0 $Proxy0 MyHandler Proxy ProxyA PJV25 InvocationHandler java.io java.lang.Object all final methods: getClass, notify, notifyAll, 3 x wait Serializable MyHandler MyInterface Proxy ProxyA 4 static methods Class[ ] sun.com.proxy sun.com.proxy $Proxy0 public final $Proxy0 public final invocation handler object proxy object interfaces 3 instant methods: hashCode equals, toString + from interfaces methods, fields value object extends implements refers PJV25