当前位置: 首页 > 知识库问答 >
问题:

带注释的AspectJ虫洞模式

姬翰林
2023-03-14

考虑以下基本的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调用时的GenerateRadom。随机你好。这可以通过以下方面实现:

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\u randomHello和p\u GeneratorAndom切入点在不组合时是独立工作的,如图所示。

共有1个答案

卜季萌
2023-03-14

在将切入点转换为注释样式时,您似乎已经对其进行了一些更改,没有必要这样做(即在您的p\u randomHello()和周围的切入点引用中复制args()。这在您的设置中适用于我:@Around(“cflow(p\u randomHello(name))

 类似资料:
  • 问题内容: 我正在寻找一个使用AspectJ进行虫洞模式实现的示例(如果Guice AOP能够实现此功能,我将很感兴趣)。 蠕虫漏洞实际上使您可以沿调用流传递其他参数,例如: 我相信Ramnivas Laddad在他的《 AspectJ in Action》一书中有这样的例子。 提前致谢。 问题答案: 实际上,AspectJ in Action中 有一个示例。如果查看目录,您会发现您正在寻找第12

  • 我试图让aspectj拦截带注释的方法: 我删除了!为了简洁起见,在(InterceptMeAspect)内,但它并没有拦截太多。如果我删除注释约束(在(@InterceptMe*)内),它可以工作,但会拦截所有内容,这会造成一个大问题。 输出字节码似乎有完整的注释,所以我希望注释标准匹配。我正在或试图进行编译时编织。这很重要,因为我有另一个方面确实使用上面相同的方法工作。我怀疑该方面正在搞乱这个

  • 所以目前,这是我所做的(不起作用): 这是与建议匹配的代码: 以及由junit测试生成的跟踪:

  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?

  • 我创建了自定义注释。我将用它来注释方法参数。 我在这里找到了一些示例代码,展示了如何创建针对自定义注释的切入点。 所以现在,我创建了一个带切入点的方面。但是我不知道如何获得用注释的参数值。

  • 我正在使用Spring的AspectJ和CGLIB代理。我有一个定义如下的方面,我希望它在具体的类上为公共方法提供建议,这些类是用批注“validatormethod”批注的: