Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Reflexe jako introspekce

Podobné prezentace


Prezentace na téma: "Reflexe jako introspekce"— Transkript prezentace:

1 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éž: PJV25

2 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

3 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

4 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

5 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

6 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

7 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

8 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


Stáhnout ppt "Reflexe jako introspekce"

Podobné prezentace


Reklamy Google