Sergej Chodarev
Sergej Chodarev
Metaprogramovanie je vytváranie programov, ktoré manipulujú programami ako dátami — analyzujú, generujú alebo transformujú iné programy alebo seba.
Reflexia (reflection) — schopnosť spusteného programu skúmať svoju štruktúru, stav a okolie a na základe toho meniť svoje správanie.
Introspekcia (introspection) — sebapozorovanie.
public class ReflectiveHelloWorld {
public void printHello() {
System.out.println("Hello from " +
this.getClass().getName());
}
}
Majme objekt o ktorom vieme, že má definovanú metódu void setColor(Color color)
, nevieme však jeho konkrétny typ.
Ako zavolať túto metódu?
public static void setObjectColor(Object obj, Color color) {
Class cls = obj.getClass();
try {
Method method = cls.getMethod("setColor", Color.class);
method.invoke(obj, color);
} catch (NoSuchMethodException ex) { ... }
catch (IllegalAccessException ex) { ... }
catch (InvocationTargetException ex) { ... }
}
Class
, Method
, Field
, Constructor
, atď.java.lang.reflect
Class<?> Object.getClass()
String.class
int.class
Class<T>
String getName()
boolean isInterface()
boolean isPrimitive()
boolean isArray()
Class<?>[] getInterfaces()
Class<? super T> getSuperclass()
Field[] getFields()
Field[] getDeclaredFields()
String getName()
Class<?> getType()
Object get(Object obj)
void set(Object obj, Object value)
Method[] getMethods()
Method[] getDeclaredMethods()
invoke(Object obj, Object... args)
Constructor<T>
T newInstance(Object<?>... initargs)
Class<T>
T newInstance()
Field
, Method
, Constructor
void setAccessible(boolean flag)
field.setAccessible(true);