Metaprogramovanie / Úvod, reflexia

Sergej Chodarev

Metaprogramovanie 1

Úvod, reflexia

Sergej Chodarev

Metaprogramovanie

Metaprogramovanie je vytváranie programov, ktoré manipulujú programami ako dátami — analyzujú, generujú alebo transformujú iné programy alebo seba.

One person’s data is another person’s program.
Guy L. Steele, Jr.

Príklady


meta-

μετά

Tento predmet

Hodnotenie

Z čoho sa učiť?

Klasifikácia

Reprezentácia programov

Typy metaprogramovania

  1. compile time
  2. link time
  3. load time
  4. run time
  1. Manipulácia s iným programom
  2. Samomanipulácia

Prečo používať metaprogramovanie?

Modularita

Metalingvistická abstrakcia

Reflexia

Reflexia

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.

Príklad


public class ReflectiveHelloWorld {
    public void printHello() {
        System.out.println("Hello from " +
                           this.getClass().getName());
    }
}

Príklad

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) { ... }
    }
  

Metaobjekty

Získanie metaobjektov

Reflection API

Class<T>

Prístup k dátovým členom

Field

Prístup k metódam

Method

Vytvorenie objektu

Demo

Čo s private?

AcessibleObject

Zdrojové kódy

https://git.kpi.fei.tuke.sk/meta/examples/json