2016-11-25 1 views
0

Ist es möglich, den Aufruf der aktuellen Methode zu deaktivieren? Was ich erreichen möchte, ist ein Aspekt, der vor meiner Methode aufgerufen wird, und wenn eine Aussage wahr ist, wird die Hauptmethode überhaupt nicht aufgerufen.Aktuellen Aufruf der Methode durch Aspekte deaktivieren

Mit Pseudo-Code wäre es so etwas wie dies

public class MyClass { 

    public void myMethod() { 
    //implementation 
    } 
} 

@Aspect 
public class MyAspect { 
    @Before("execution(* MyClass.myMethod(..))") 
    public void doSth() { 
    //do something here but if some statement is true then don't call myMethod 
    } 
} 

sein Ist es überhaupt möglich? Oder ist es vielleicht mit etwas anderem nicht möglich?

+0

Was ist falsch daran, nur eine "if" -Anweisung in Ihrem Methodenblock hinzuzufügen? –

+0

Sie können '@ Around' und Joinpoint verwenden, um dies zu erreichen – iNan

+0

@RobertColumbia es ist mehr wie 'wenn möglich' Frage. Nur meine Neugier. – wawek

Antwort

1

Mit @Around und ProceedingJoinPoint sollten Sie dies tun können. Zum Beispiel

@Around("execution(* MyClass.myMethod())") 
    public void doSth(ProceedingJoinPoint joinpoint) throws Throwable { 

    boolean invokeMethod = false; //Should be result of some computation 
    if(invokeMethod) 
    { 
     joinpoint.proceed(); 
    } 
    else 
    { 
     System.out.println("My method was not invoked"); 
    } 
    } 

Ich habe invokeMethod boolean false hier gesetzt, aber es sollte das Ergebnis einer Berechnung sein, die Sie tun würden, um zu bestimmen, ob Sie eine Methode oder nicht ausgeführt werden sollen. joinPoint.proceed führt das tatsächliche Aufrufen der Methode durch.

+0

Wissen Sie, wie Sie diesen Aspekt in ein anderes Projekt einbeziehen können? Wenn ich es als Maven-Abhängigkeit importiert habe, funktioniert der Aspekt nicht (er funktioniert nur in dem Projekt, in dem er implementiert ist). Ich habe aspectj libs in meinem externen Projekt hinzugefügt, aber es hat nichts geändert. – wawek

+0

@wawek, Ihre Frage ist völlig unabhängig von diesem, Sie sollten es nicht entführen. Wenn Sie wissen möchten, wie Sie richtig [AspectJ Maven Plugin] (http://www.mojohaus.org/aspectj-maven-plugin/) verwenden, lesen Sie bitte die Beschreibung und/oder verwenden Sie die Suche hier auf SO, ich habe geantwortet viele Fragen dazu. – kriegaex