2015-10-20 44 views
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切入點獨立工作,在不如圖所示。

+1

你似乎在將它轉換爲註釋樣式時有點改變了,沒有必要這樣做(即在你的'p_randomHello()'中複製args() '@圍繞'切入點參考)。這適用於你的設置:@Around(「cflow(p_randomHello(name))&& p_generateRandom()」) –

+0

謝謝安迪,這個作品完美!請發帖作爲答案,我會解決。 – Trygve

回答

1

當您將切入點轉換爲註釋樣式時,您似乎已經稍微更改了切入點,不需要這樣做(即在p_randomHello()@Around切入點引用中複製args())。這適用於你的設置:@Around("cflow(p_randomHello(name)) && p_generateRandom() "