gpt4 book ai didi

java - 带注释的 AspectJ 虫洞模式

转载 作者:行者123 更新时间:2023-12-01 11:02:21 26 4
gpt4 key购买 nike

考虑以下基本 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()@ 中复制 args() )围绕 切入点引用)。这在您的设置中适用于我: @Around("cflow(p_randomHello(name)) && p_generateRandom() "

关于java - 带注释的 AspectJ 虫洞模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33237387/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com