2016-06-24 21 views
0

ich habe eine Methodensignatur, dieWie kann ich @aspectJ gezielt auf bestimmte Unterklassen ausrichten, wenn die Methodensignatur die Elternklasse hat?

public void accept(ParentInterface parent) 

wo ParentInterface eine Schnittstelle ist. Ich möchte, dass mein Pointcut nur spezifisch auf eine Klasse TestA abzielt, aber nicht auf eine Klasse TestB, die beide das ParentInterface implementieren.

Derzeit habe ich folgende pointcut:

@Pointcut("call(public void accept(package.ParentInterface))") 

Aber das würde Instanzen fangen, wo akzeptieren wird auch in einer TestB Beispiel nehmen. Gibt es eine Methode, dies zu beheben?

Antwort

0

Interface + + Implementierungen Treiberanwendung:

package de.scrum_master.app; 

public interface ParentInterface {} 
package de.scrum_master.app; 

public class TestA implements ParentInterface {} 
package de.scrum_master.app; 

public class TestB implements ParentInterface {} 
package de.scrum_master.app; 

public class Application { 
    public void accept(ParentInterface parent) {} 

    public static void main(String[] args) { 
     Application application = new Application(); 
     application.accept(new TestA()); 
     application.accept(new TestB()); 
    } 
} 

Aspect Fesselung Argumenttyp über args() + pointcut Methodensignatur:

package de.scrum_master.aspect; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 

import de.scrum_master.app.TestA; 

@Aspect 
public class MyAspect { 
    @Pointcut("call(public void accept(de.scrum_master.app.ParentInterface)) && args(argument)") 
    static void acceptCalls(TestA argument) {} 

    @Before("acceptCalls(argument)") 
    public void intercept(TestA argument, JoinPoint thisJoinPoint) { 
     System.out.println(thisJoinPoint + " -> " + argument); 
    } 
} 

Konsolenprotokoll:

call(void de.scrum_master.app.Application.accept(ParentInterface)) -> [email protected]