当前位置: 首页 > 面试题库 >

使用AspectJ实现虫洞模式

锺星洲
2023-03-14
问题内容

我正在寻找一个使用AspectJ进行虫洞模式实现的示例(如果Guice AOP能够实现此功能,我将很感兴趣)。

蠕虫漏洞实际上使您可以沿调用流传递其他参数,例如:

// say we have
class foo {
   public int m0 int a, int b) {
     return m1(a,b);
   }

   public int m1 int a, int b) {
     return m2(a,b);
   }

   public int m2 int a, int b) {
     return a+b;
   }
}
// and I wanted in a non-invasive manner to pass a third parameter of type
class context {
  String userName;
  long timeCalled;
  String path;
}
// I could use an advise to say print the context information
// to trace what was going on without mucking up my method signatures

我相信Ramnivas Laddad在他的《 AspectJ in Action》一书中有这样的例子。

提前致谢。


问题答案:

实际上,AspectJ in
Action中
有一个示例。如果查看目录,您会发现您正在寻找第12.2章。买书是个好主意。我可以热烈推荐。因为我不确定只复制并粘贴本书的部分内容是否可以,所以我在这里引用模板:

public aspect WormholeAspect {
    pointcut callerSpace(<caller context>) :
        <caller pointcut>;

    pointcut calleeSpace(<callee context>) :
        <callee pointcut>;

    pointcut wormhole(<caller context>, <callee context>) :
        cflow(callerSpace(<caller context>)) && 
        calleeSpace(<callee context>);

    // advice to wormhole
    before(<caller context>, <callee context>) :
        wormhole(<caller context>, <callee context>)
    {
            ... advice body
    }
}

Laddad在TheServerSide.com上有一篇旧文章,其中有一个更具体的示例。它与书中的不是同一本书,而是相似的。

如您所见,在AspectJ中很容易做到,因为那里有cflow()切入点。我从未使用过Guice,但是在其AOP简介页中提到它们的实现是AOP
Alliance
规范的一部分。看一下AOP Alliance
API
,没有什么看起来像cflow()切入点,而是构造函数和方法调用以及字段访问。

那么,如果要避免在所有层中传递参数,您可以在Spring(没有AspectJ)或Guice中做什么?显而易见的解决方案是ThreadLocal由调用方声明和管理(即分配但也清除)并由被调用方访问的变量。这不是很好,只是一种解决方法,以免使API膨胀。但是,这要求主叫方和被叫方都对要共享的内容以及共享方式有共同的了解。从某种意义上说,这种实现更多是反模式而不是模式。如果可以,请使用AspectJ以便以一种干净的模块化方式解决此问题,将要解决的问题封装在一个模块(方面)中。



 类似资料:
  • 考虑以下基本的Foo、Bar和Main类: 运行Main打印“20个随机AspectJ字节”。我想取代执行吧。从Foo调用时的GenerateRadom。随机你好。这可以通过以下方面实现: 这可以工作,Main现在打印“7个随机AspectJ字节”。 如何使用注释表达相同的方面?这是我的尝试: 这不起作用,我收到以下编译器警告: 我已经验证了p\u randomHello和p\u Generato

  • 本文向大家介绍Android利用爬虫实现模拟登录的实现实例,包括了Android利用爬虫实现模拟登录的实现实例的使用技巧和注意事项,需要的朋友参考一下 Android利用爬虫实现模拟登录的实现实例 为了用手机登录校网时不用一遍一遍的输入账号密码,于是决定用爬虫抓取学校登录界面,然后模拟填写本次保存的账号、密码,模拟点击登录按钮。实现过程折腾好几个。 一开始选择的是htmlunit解析登录界面htm

  • 问题内容: 仅使用编译时编织尝试为大量DTO编织默认的toString()方法。目标是使用Jackson库返回JSON表示形式。 遵循本文的建议,将其转换为注释样式的方面配置,并得到以下代码: 在结果类上运行表明它们实现了JsonToString接口,但是在任何地方都没有toString()方法的迹象。 如果我将方法名称更改为与Object.toString()不冲突的名称(例如toString2

  • 我试图在Spring3.1.5上用AOP实现日志记录。但在运行时,我会得到以下异常 下面是我的aspect类的详细信息: 伙计们,我真的被这个困住了,我也是Aop的新手,请帮我解决这个问题!!!

  • 本文向大家介绍利用C#实现网络爬虫,包括了利用C#实现网络爬虫的使用技巧和注意事项,需要的朋友参考一下 网络爬虫在信息检索与处理中有很大的作用,是收集网络信息的重要工具。 接下来就介绍一下爬虫的简单实现。 爬虫的工作流程如下 爬虫自指定的URL地址开始下载网络资源,直到该地址和所有子地址的指定资源都下载完毕为止。 下面开始逐步分析爬虫的实现。 1. 待下载集合与已下载集合 为了保存需要下载的URL

  • 本文向大家介绍详解在Spring中如何使用AspectJ来实现AOP,包括了详解在Spring中如何使用AspectJ来实现AOP的使用技巧和注意事项,需要的朋友参考一下 AspectJ 是通过注解来描述切点与增强的。 1 开发环境要求 因为要使用注解,所以请确保使用的 Java5.0 及以上版本。 引入 AspectJ 相关类库: 2 编程方式 @Aspect//标识切面 这个切面只是一个普通的