© Excellent backgrounds/Shutterstock.com
Java Magazin
Teil 3: Das DynamicObjectAdapter-Pattern im Einsatz

Der Klassiker

In den letzten Teilen dieser Artikelserie hatten wir uns mit dem Proxy und dort mit dem DynamicProxy beschäftigt. Allem gemein ist es gewesen, dass mit einem Proxy immer eine vollständige Instanz von einem Proxy umhüllt worden ist. Aber kann man das noch filigraner gestalten? Ja, wir schaffen das.

Sven Ruppert


ArtikelserieTeil 1: Das Builder-Pattern im EinsatzTeil 2: Das Proxy-Pattern im EinsatzTeil 3: Das DynamicObjectAdapter-Pattern im EinsatzTeil 4: DI-Frameworks

Dr. Heinz Kabutz hatte vor einigen Jahren das Pattern DynamicObjectAdapter vorgestellt und eine Lösung basierend auf dem DynamicProxy erstellt. Aber was genau ist das nun? Ich werde hier nur kurz das Pattern beschreiben. Eine ausführliche Beschreibung dazu ist im Buch „Dynamic Proxies“ zu finden [1].

Die Grundidee des DynamicObjectAdapters ist recht überschaubar. Auf Basis eines DynamicProxys wird bei jedem Aufruf einer Methode nachgesehen, ob es eine neue Implementierung dieser Methode gibt. Wenn ja, wird diese auf der dazugehörigen Instanz ausgeführt. Wenn nicht, wird das Original ausgeführt (Abb. 1).

Abb. 1: Beim DynamicObjectAdapter wird auf Basis eines DynamicProxys bei jedem Aufruf einer Methode geprüft, ob es eine neue Implementierung dieser Methode gibt

Es stellen sich nun einige Fragen. Eine davon ist, wie ich eine Methode erkenne, um darauf basierend z. B. in einer HashMap nachsehen zu können, ob es einen Adapter für diese Methode gibt. Die Identifikation einer Methode oder das Erzeugen einer Schlüsselinstanz für eine Map ist in Java sehr einfach. Man benötigt nur den Namen der Methode und die Klassen der Eingabeparameter (Listing 1).

Listing 1: Methode identifizierenpublic class MethodIdentifier { private final String name; private final Class[] parameters;  public MethodIdentifier(Method m) { name = m.getName(); parameters = m.getParameterTypes(); }  public int hashCode() { return name.hashCode(); }  // we can save time by assuming that we only compare against // other MethodIdentifier objects public boolean equals(Object o) { MethodIdentifier mid = (MethodIdentifier) o; return name.equals(mid.name) && Arrays.equals(parameters, mid.parameters); }}

Nun kann zu jeder Instanz einer Klasse Method der jeweilige Schlüssel für die Map erzeugt werden. Wir implementieren nun den InvocationHandler, der in unserem Fall für den DynamicObjectAdapter mittels DynamicProxy verwendet werden soll. Als Erstes fügen wir eine Methode dem InvocationHandler hinzu, der es uns erlaubt, einen Adapter zu setzen (Listing 2).

Listing 2: InvocationHandlerprivate static class DOAInvocationHandler implements InvocationHandler { private Map adaptedMethods = new HashMap(); private T original; private Object adapter;  p...

Java Magazin
Teil 3: Das DynamicObjectAdapter-Pattern im Einsatz

Der Klassiker

In den letzten Teilen dieser Artikelserie hatten wir uns mit dem Proxy und dort mit dem DynamicProxy beschäftigt. Allem gemein ist es gewesen, dass mit einem Proxy immer eine vollständige Instanz von einem Proxy umhüllt worden ist. Aber kann man das noch filigraner gestalten? Ja, wir schaffen das.

Sven Ruppert


ArtikelserieTeil 1: Das Builder-Pattern im EinsatzTeil 2: Das Proxy-Pattern im EinsatzTeil 3: Das DynamicObjectAdapter-Pattern im EinsatzTeil 4: DI-Frameworks

Dr. Heinz Kabutz hatte vor einigen Jahren das Pattern DynamicObjectAdapter vorgestellt und eine Lösung basierend auf dem DynamicProxy erstellt. Aber was genau ist das nun? Ich werde hier nur kurz das Pattern beschreiben. Eine ausführliche Beschreibung dazu ist im Buch „Dynamic Proxies“ zu finden [1].

Die Grundidee des DynamicObjectAdapters ist recht überschaubar. Auf Basis eines DynamicProxys wird bei jedem Aufruf einer Methode nachgesehen, ob es eine neue Implementierung dieser Methode gibt. Wenn ja, wird diese auf der dazugehörigen Instanz ausgeführt. Wenn nicht, wird das Original ausgeführt (Abb. 1).

Abb. 1: Beim DynamicObjectAdapter wird auf Basis eines DynamicProxys bei jedem Aufruf einer Methode geprüft, ob es eine neue Implementierung dieser Methode gibt

Es stellen sich nun einige Fragen. Eine davon ist, wie ich eine Methode erkenne, um darauf basierend z. B. in einer HashMap nachsehen zu können, ob es einen Adapter für diese Methode gibt. Die Identifikation einer Methode oder das Erzeugen einer Schlüsselinstanz für eine Map ist in Java sehr einfach. Man benötigt nur den Namen der Methode und die Klassen der Eingabeparameter (Listing 1).

Listing 1: Methode identifizierenpublic class MethodIdentifier { private final String name; private final Class[] parameters;  public MethodIdentifier(Method m) { name = m.getName(); parameters = m.getParameterTypes(); }  public int hashCode() { return name.hashCode(); }  // we can save time by assuming that we only compare against // other MethodIdentifier objects public boolean equals(Object o) { MethodIdentifier mid = (MethodIdentifier) o; return name.equals(mid.name) && Arrays.equals(parameters, mid.parameters); }}

Nun kann zu jeder Instanz einer Klasse Method der jeweilige Schlüssel für die Map erzeugt werden. Wir implementieren nun den InvocationHandler, der in unserem Fall für den DynamicObjectAdapter mittels DynamicProxy verwendet werden soll. Als Erstes fügen wir eine Methode dem InvocationHandler hinzu, der es uns erlaubt, einen Adapter zu setzen (Listing 2).

Listing 2: InvocationHandlerprivate static class DOAInvocationHandler implements InvocationHandler { private Map adaptedMethods = new HashMap(); private T original; private Object adapter;  p...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang