2009-03-10 7 views
3

Ich habe ein Objekt der Klasse A. Ich möchte eine der Methoden dieser Klasse überschreiben. Kann das gemacht werden?Ist es in Java möglich, bei einem gegebenen Objekt eine der Methoden zu überschreiben?

Genauer gesagt, ich habe ein Objekt, das in ein Feld injiziert wird. Ich muss eine der Methoden überschreiben, bevor ich sie verwenden kann.

Ich versuche zu sehen, ob Reflection helfen könnte, das Problem zu lösen. Beachten Sie, dass die Methode, die ich versuche, zu überschreiben, nicht von privaten Variablen dieser Klasse abhängig ist.

Antwort

5
+0

Dies funktioniert nur mit Schnittstellen, afaik. –

+0

Ich sehe nicht, wie das die richtige Antwort ist. Es funktioniert nur mit Schnittstellen, dh Sie überschreiben nicht (d. H. Eine existierende) Methode. Klingt wie Aspekte sind der einzig vernünftige Ansatz. – Robin

+0

Er verwendet wahrscheinlich bereits Schnittstellen, sodass er Dynamic Proxy-Klassen verwenden kann, um das Verhalten zu ändern, das er ändern möchte, und das Verhalten, das er nicht ändern möchte, an eine Implementierung zu delegieren. –

3

CGLIB sollte Ihnen helfen, zu erreichen, was Sie versuchen zu tun. Schauen Sie sich Enhancer class an.

+0

Seien Sie vorsichtig mit Enhancer, weil es eine stark verwirrte Illusion über den Unterschied zwischen Delegation und Vererbung hat. Zum Beispiel sollten Sie besser hoffen, dass die "enhanced" -Klasse keine Instanzmethoden in ihrem Konstruktor aufruft. – erickson

3

Ja.

Überschreiben bedeutet, eine neue Klasse zu schreiben, sie zu kompilieren, die Injektion zu ändern, um die neue Klasse zu verwenden, und sie mit dem Rest Ihrer App zu verpacken. Natürlich kann es gemacht werden, aber ich sehe nicht, warum du nachdenken willst.

Wenn Sie möchten, dass dies eine dynamische Sache ist, sprechen Sie über aspektorientierte Programmierung.

3

Angenommen, Sie erhalten das Objekt und können es daher nicht ableiten: Sie können einen Proxy schreiben. Weiterleiten an alle Methoden, mit Ausnahme desjenigen, den Sie überschreiben möchten. Natürlich wird kein anderer Verweis auf dieses Originalobjekt den Proxy verwenden. Insbesondere, wenn das Objekt selbst intern Methoden für sich selbst aufruft, wird dies nicht die Methode "überschrieben" verwenden.

Alternativ können Sie den Code, der die Methode aufruft, neu schreiben oder die implementierende Klasse ändern, indem Sie AOP-ähnliche Hacks verwenden.

Wahrscheinlich möchten Sie sorgfältig über Ihr Design nachdenken.