Metaprogramovanie / Dynamické proxy a načítavanie tried

Sergej Chodarev

Dynamické proxy a načítavanie tried

Metaprogramovanie 4

Sergej Chodarev

Reflexia

Vieme niečo aj vytvoriť?

Dynamické proxy

Čo potrebujeme?

Použitie


Object proxy = Proxy.newProxyInstance(
                      SomeInterface.class.getClassLoader(),
                      new Class[]{ SomeInterface.class },
                      invocationHandler);
  

InvocationHandler


Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable

Príklad

Trasovanie (tracing)

Riešenie

Zdrojový kód

Použitie dynamických proxy

Spring

Spring Framework

Spring Data

Spring Data

Príklad

Kód

https://git.kpi.fei.tuke.sk/meta/examples/spring-data

Čo bol ten ClassLoader?

ClassLoader

Ako získať ClassLoader

Každá trieda je identifikovaná

  1. Plným názvom
  2. ClassLoaderom

Načítanie triedy

Príklad — dynamické načítanie triedy

String dbClassName = props.getProperty("dbClass",
                                       "sk.tuke.StubDB");
Class dbClass = Class.forName(dbClassName);
customerDB = (CustomerDatabase) dbClass.newInstance();

Dynamické načítanie triedy

Čo sa vlastne načítava?

Java bytecode

int x = 5;
int y = 10;
int z = x + y * 7;
 0: iconst_5
 1: istore_1
 2: bipush    10
 4: istore_2
 5: iload_1
 6: iload_2
 7: bipush    7
 9: imul
10: iadd
11: istore_3

Súbor .class

Generovanie a modifikovanie bajtkódu

Java Agents

Je reflexia pomalá?

Vyskúšajme!

Kód

https://git.kpi.fei.tuke.sk/meta/examples/reflection-performance