Cześć
Czy ktoś by mi mógł wyjaśnić po co się stosuje dynamiczne proxy, skąd płynie wygoda stosowania tego wzorca projektowania, w jakich zastosowaniach. I jak w poniższym kodzie wywołują się kolejne metody. Czytam dokumentację i artykuły ale nie mogę za diabła tego zrozumieć...
Czytam Thinkig in Java i autor podaje taki przykład:
//: typeinfo/SimpleDynamicProxy.java
import java.lang.reflect.*;
interface Interface {
void doSomething();
void somethingElse(String arg);
}
class RealObject implements Interface {
public void doSomething() { print("doSomething"); }
public void somethingElse(String arg) {
print("somethingElse " + arg);
}
}
class DynamicProxyHandler implements InvocationHandler {
private Object proxied;
public DynamicProxyHandler(Object proxied) {
this.proxied = proxied;
}
public Object
invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("**** proxy: " + proxy.getClass() +
", metoda: " + method + ", argumenty: " + args);
if(args != null)
for(Object arg : args)
System.out.println(" " + arg);
return method.invoke(proxied, args);
}
}
class SimpleDynamicProxy {
public static void consumer(Interface iface) {
iface.doSomething();
iface.somethingElse("bonobo");
}
public static void main(String[] args) {
RealObject real = new RealObject();
consumer(real);
// Wstawienie proxy i ponowne wywołanie:
Interface proxy = (Interface)Proxy.newProxyInstance(
Interface.class.getClassLoader(),
new Class[]{ Interface.class },
new DynamicProxyHandler(real));
consumer(proxy);
}
}
oraz pisze:
"[...]. Dynamiczne proxy będzie przekierowywało wszystkie wywołania do tejże implementacji (chyba autor miał na myśli interfejs Interface odnośnie kodu powyżej), więc konstruktor obiektu obsługującego wywołania (****Jakiego obiektu?) zwykle otrzymuje w wywołaniu referencję obiektu docelowego (jakiego obiektu docelowego?), tak aby mógł delegować do niego wywołania po wykonaniu swoich zdań dodatkowych."
Kompletnie tego nie rozumiem.
- Kiedy i gdzie wywoływana jest metoda invoke interfejsu InvocationHandler?
- Czy mógłby mi ktoś rozpisać w punktach jak to kolejno przebiega, co się po kolei dzieje?
Co do zwykłego proxy to rozumiem, że jest sobie pewien interfejs Inter z metodą method(). Ten interfejs implementuje klasa X oraz klasa Proxy. Klasa Proxy w swoim konstruktorze przyjmuje jakiś obiekt impelemtujący interfejs Inter, powiedzmy że np. przekażemy obiekt X. Proxy w swojej implementacji method() interfejsu Inter oprócz jakiś swoich czynności wywołuje na rzecz obiektu przekazanego w konstruktorze dodatkowo jego wersje implementacji method interfejsu Inter. W ten sposób klasa Proxy dodała dodatkowe funkcjonalności do swojej implementacji metody method z implementacji method obiektu X, wywołując po prostu X.method().
Tak rozumiem zwykłe Proxy, czy to rozumowanie jest poprawne? Dynamicznego proxy w cale nie rozumiem :(
Dzięki za wszelką pomoc :)
Instrumentacja bytecodu
to możliwość w locie zmieniania kodu. Pierwszy rzecz to bryndza, ale użyteczna w poraktyce. Druga, to już prawdziwy kataklizm. W profilowaniu i tego typu działaniach, ma sens, gorzej jak twój framework na tym polega....scibi92scibi92