2012-11-12 7 views
6

Ich möchte einem Objekt, das zur Laufzeit generiert wird, einige Funktionen hinzufügen. Allerdings ist die Schnittstelle für dieses Objekt sehr groß (und nicht unter meiner Kontrolle). Ich möchte das Objekt in meine eigene Klasse einbinden, die die gewünschte Funktionalität hinzufügt und die Standardschnittstellenfunktionalität an das ursprüngliche Objekt delegiert - gibt es eine Möglichkeit, dies in Java zu tun, ohne für jeden eine 1-zeilige Kopie-Einfüge-Delegator-Methode zu erstellen Methode in der Schnittstelle?Automatisierte Delegierung in Java

Was ich will, vermeiden:

class MyFoo implements Foo { 
    Foo wrapped; 

    void myMethod() { ... } 

    void interfaceMethod1() wrapped.interfaceMethod1(); 
    int interfaceMethod2() wrapped.interfaceMethod2(); 
    // etc etc ... 
} 

Was ich würde es vorziehen:

class MyFoo implements Foo { 
    Foo wrapped; 

    void myMethod() { ... } 

    // automatically delegate undefined methods to wrapped object 
} 

Antwort

10

Klingt wie Sie einen dynamic proxy und Intercept nur die Methoden müssen Sie außer Kraft setzen möchten.

Eine dynamische Proxy-Klasse ist eine Klasse, die eine Liste von Schnittstellen angegeben zur Laufzeit implementiert, so dass ein Verfahrensaufruf durch eine der Schnittstellen auf einer Instanz der Klasse wird codiert werden und versandt auf ein anderes Objekt durch eine einheitliche Schnittstelle. Daher kann eine dynamische Proxy-Klasse verwendet werden, um ein typsicheres Proxy-Objekt für eine Liste von -Schnittstellen zu erstellen, ohne dass die Proxy-Klasse, wie , mit Kompilierzeit-Tools vorgeneriert werden muss. Methodenaufrufe auf einer Instanz einer dynamischen Proxy-Klasse zu einem einzigen Verfahren in der Prozedur-Aufruf -Instanz ausgelöst werden, und sie sind mit einer Methode von java.lang.reflect Objekt codiert, das Verfahren zu identifizieren, war aufgerufen und ein Array vom Typ Object

die Argumente, die (Hervorhebung von mir)

von InvocationHandler Implementierung Sie einfach eine Methode erstellen, die jeden Aufruf für das Objekt empfängt (effektiv, was Sie oben beschrieben haben)

+2

+1, genau das, was ich verwenden würde. Siehe meine Antwort [hier] (http://stackoverflow.com/a/12486028/646634) für einige Codebeispiele. – Brian

+0

Danke, das ist, was ich gesucht habe. Brian, deine Beispiele waren auch sehr nützlich! –

+1

Ist es möglich, Kompilierzeit-Proxies zu haben? – smac89

Verwandte Themen