2016-03-20 5 views
0

Ich bin auf der Suche zu sagen, wenn eine bestimmte Methode in einer Schnittstelle aufgerufen wird, da eine einfache Schnittstelle:Wie kann man sagen, wenn eine Methode in einer Schnittstelle aufgerufen wird

public interface Foo { 
    String bar(); 
    int foobar(); 
} 

Ich möchte in der Lage sein, etwas zu tun wenn bar() in einer anderen Klasse aufgerufen wird, aber ich möchte andere Klassen implementieren Foo und @Override seine Methoden.

Denken Sie daran, dass ich die Klasse Foo nicht bearbeiten kann.

+0

Bar muss außer Kraft gesetzt werden, um angerufen zu werden. Warum nicht beim Überschreiben implementieren? –

+2

Was meinen Sie mit "Sie möchten gesagt werden, wenn bar()" aufgerufen wird. Warum willst du das? Ich frage, weil es eigentlich keinen sauberen Weg dafür gibt. Oder mit anderen Worten: Es ist sehr wahrscheinlich, dass Ihr Gesamtdesign gebrochen ist, wenn Sie denken, dass Sie solche Informationen benötigen (zur Laufzeit). Also erzähl uns bitte ein bisschen mehr ... – GhostCat

+0

Du kannst es mit aspektorientierter Programmierung machen: http://aspects.jcabi.com/ und speziell etwas wie die 'Loggable' Annotation: http://aspects.jcabi.com/ apidocs-0.22.3/com/jcabi/aspects/Loggable.html –

Antwort

0

Sie können nicht, Schnittstellen sind wirklich blind und sie bieten keine Möglichkeit zu überprüfen, die ihre Methoden implementiert ..

+0

Gibt es eine Art Workaround? – Okx

+1

Gibt es nicht; Die Problemumgehung ist höchstwahrscheinlich, dass Sie Ihr Design an das anpassen, was in der Java-Sprache sinnvoll ist. – GhostCat

1

Wenn Sie nur einen Code nennen wollen, bevor oder nachdem bar Implementierung Aufruf, ich denke, dass es möglich ist, mit AOP (aspektorientierte Programmierung) und AspectJ. können Sie dieses Thema verwenden: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

+0

Ich kann die Klasse 'Foo' nicht bearbeiten, und das ist es nicht, was ich sowieso brauche. – Okx

+0

Ja ich weiß, aber mit AspectJ können Sie Schnittstelle und Methode markieren mit: @Around ("Ausführung (* * (..)) && @ Annotation (Loggable)") – ust3000

+0

Sie erstellen neue Klasse MethodLogger.java wie folgt: @Aspect öffentliche Klasse MethodLogger { @Around ("Ausführung (* FOO.bar (..)) && @annotation (Loggable)") öffentlichen Objekt um (ProceedingJoinPoint Punkt) { // Ihr Code ... Ergebnis zurückgeben; } } Um die ursprüngliche Methode bar() aufzurufen, muss der Advice proced() des Join-Punktobjekts aufgerufen werden. Sie kompilieren diesen Aspekt und stellen ihn zusammen mit unserer Hauptdatei Foo.class im Klassenpfad zur Verfügung. – ust3000

0

Sie keine Methode in der Schnittstelle definieren kann, aber Sie können eine Superklasse erstellen, die diese Schnittstelle implementiert, hier können Sie ein Super Methode definieren, wenn wir es wie diese nennen können, so dass jede Unterklasse dieser Klasse tut das gleiche, aber wenn Sie die Methode ändern möchten, ändern Sie es einfach in der neuen Unterklasse.

Verwandte Themen