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

Z čoho sa učiť?

Metaprogramovanie

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

Čo je to program?

Computer Program

computer program, detailed plan or procedure for solving a problem with a computer; more specifically, an unambiguous, ordered sequence of computational instructions necessary to achieve such a solution. The distinction between computer programs and equipment is often made by referring to the former as software and the latter as hardware.

— Encyclopædia Britannica

Aký tvár má program?

ENIAC
Manchester University SSEM 'Baby' replica

Ako vyzerá program?

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}
ELF file layout
Linux process segment layout

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

"Magic" is just a word programmers use for poetry in code that they don't appreciate at first glance. I love magic and learning how it works! We're supposed to be the wizards of the computer.

— DHH (@dhh) February 8, 2025

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

Článok