当方法签名具有父类时,如何让@AspectJ定位特定的子类?

时间:2016-06-24 21:04:11

标签: aspectj

假设我有一个

的方法签名
public void accept(ParentInterface parent)

其中ParentInterface是一个接口。我希望我的切入点只能专门针对一个类TestA,而不是一个类TestB,它们都实现了ParentInterface。

目前,我有以下切入点:

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

但是这会捕获accept接受TestB实例的实例。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

接口+实现+驱动程序应用程序:

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());
    }
}

通过args() +切入点方法签名固定参数类型的方面:

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);
    }
}

控制台日志:

call(void de.scrum_master.app.Application.accept(ParentInterface)) -> de.scrum_master.app.TestA@4a574795