0
考慮以下基本美孚,酒吧和主要類型:註釋AspectJ的蟲洞模式
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"));
}
}
運行主要版畫「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()」) –
謝謝安迪,這個作品完美!請發帖作爲答案,我會解決。 – Trygve