带注释的 AspectJ 虫洞模式

Annotated AspectJ wormhole pattern

考虑以下基本的 Foo、Bar 和 Main 类:

package foo;

public class Foo {

    public String randomHello(String name) {
        byte[] random = Bar.generateRandom();
        return random.length + " random  " + name + " bytes";
    }
}

public class Bar {

    public static byte[] generateRandom(){
        byte[] b = new byte[20];
        new Random().nextBytes(b);
        return b;
    }
}

public class Main {

    public static void main(String[] args) {
        Foo foo = new Foo();
        System.out.println(foo.randomHello("AspectJ"));
    }
}

运行 Main 打印“20 个随机 AspectJ 字节”。当从 Foo.randomHello 调用时,我想替换 Bar.generateRandom 的实现。这是通过以下方面实现的:

public aspect FooBarAspect {

    pointcut p_randomHello(String name) :
        execution(public String foo.Foo.randomHello(String)) && args(name);

    pointcut p_generateRandom() :
        call(public byte[] foo.Bar.generateRandom());

    Object around(String name) :
        cflow(p_randomHello(name)) && p_generateRandom() {

        byte[] b = new byte[name.length()];
        new Random().nextBytes(b);
        return b;

    }
}

这有效,Main 现在打印“7 个随机 AspectJ 字节”。

如何使用注释表达相同的方面?这是我的尝试:

@Aspect
public class FooBarAnnotatedAspect {

    @Pointcut("execution(public String foo.Foo.randomHello(String)) && args(name)")
    public void p_randomHello(String name){};

    @Pointcut("call(public byte[] foo.Bar.generateRandom())")
    public void p_generateRandom(){};

    @Around("cflow(foo.FooBarAnnotatedAspect.p_randomHello(String)) && " +
            "foo.FooBarAnnotatedAspect.p_generateRandom() && args(name)")
    public Object a_foobar(ProceedingJoinPoint joinPoint, String name) throws Throwable {
        byte[] b = new byte[10];
        new Random().nextBytes(b);
        return b;
    }
}

这不起作用,我收到以下编译器警告:

advice defined in foo.FooBarAnnotatedAspect has not been applied [Xlint:adviceDidNotMatch]

我已经验证 p_randomHello 和 p_generateRandom 切入点是独立工作的,而不是像这里显示的那样组合使用。

您似乎在将切入点转换为注释样式时稍微更改了切入点,没有必要这样做(即在 p_randomHello()@Around 切入点参考中复制 args() ).这在您的设置中对我有用:@Around("cflow(p_randomHello(name)) && p_generateRandom() "