Proxy erzeugen für Lazy Loading
-
Folgendes Beispiel: NonLazy, Elem(interface) und ElemImpl existieren bereits, sind für mich unveränderlich:
public NonLazy { public Elem createElem (byte[] data) { return new ElemImpl(data); } }
Ein Parser baut nun (ähnlich DOM) via createElem() eine Struktur auf. Jetzt ist es aber so, dass data sehr groß werden kann (mehrere MB) und wir das nicht alles im Heap abspeichern wollen, vor allem weil wir letzten Endes nur wenige Elem benötigen.
Ich möchte nun gerne von NonLazy ableiten und createElem so überschreiben dass es einen Proxy zurückgibt der, sobald eine Methode des Proxies aufgerufen wird, dann über eine von mir zur Verfügung gestellte Methode ein echtes ElemImpl erstellt.
Gibt es eine Java-Library die mich quasi soetwas machen lässt:
public Lazy extends NonLazy { @Override public Elem createElem (byte[] data) { return new Proxy<ElemImpl>() { public ElemImpl provideObject() { byte[] bytes = ...; // bytes erst jetzt aus einem file beziehen return new ElemImpl(bytes); } }; } }
Falls es da noch keine fertigen Libraries gibt, wie vorgehen in Java?
MfG SideWinder
-
Bringt dir der Link etwas:
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html
und
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/InvocationHandler.html
?
-
Nicht ganz, da man damit scheinbar nur Interfaces implementieren kann, ElemImpl ist aber kein Interface und implementiert weitere Interfaces + extended sogar eine Klasse.
Leider verlässt sich die interne Implementierung von NonLazy darauf ihre eigene Elem-Implementierung (also ElemImpl) zu bekommen, weswegen ich unbedingt das komplette ElemImpl "proxyien" muss und nicht nur das Elem-Interface.
MfG SideWinder
-
Sieht so aus als müsste ich auf CGLib oder javassist zurückgreifen...
MfG SideWinder
-
SideWinder schrieb:
Leider verlässt sich die interne Implementierung von NonLazy darauf ihre eigene Elem-Implementierung (also ElemImpl) zu bekommen, weswegen ich unbedingt das komplette ElemImpl "proxyien" muss und nicht nur das Elem-Interface.
Ah, verstehe. Du kannst den bestehenden Code nicht anpassen.
Und dass du von ElemImpl erbst und halt das Lazy Loading händisch machst?
-
Shade Of Mine schrieb:
Und dass du von ElemImpl erbst und halt das Lazy Loading händisch machst?
Wollte ich zuerst vermeiden, da ElemImpl nicht das einzige solche Objekt ist, ergo viel Aufwand. Aber CGLib-Proxies funktionieren leider nicht weil NonLazy intern eine bestimmte Methode in ElemImpl aufruft und somit die Lade-Jetzt-Methode sofort zuschlägt.
Wird mir also nichts anderes übrig bleiben als von allen *Impl-Klassen abzuleiten und das LL selbst zu basteln. Danke trotzdem für die Tipps!
MfG SideWinder