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

AOP(AspectJ):有没有办法在处理程序通知中获取封闭方法的上下文参数?

吕修筠
2023-03-14

我有一个AspectJ建议,它的切入点是处理程序类型切入点。

下面是我要建议的包含连接点的方法:

public void foo(String p1) {
    try {
        // some code
    }
    catch(Exception ex) {
        // more code    
    }
}

以下是我的方面的代码:

pointcut foopc(Exception ex) : handler(Exception) && args(ex) && withincode(public void foo(String));

before(Exception ex) : foopc(ex) {
    // advice body  
}

我想要的是捕获变量p1并在建议正文中使用它(除了异常ex之外)。这有可能吗?如果是这样,我该怎么做?


共有1个答案

姚钊
2023-03-14

我相信我已经弄明白了。如果有人有更好的答案或更合适的方式,我会接受它而不是我的。

方面中的代码:

pointcut fooExec(String p1) : 
    execution(public void foo(String)) && args(p1);

pointcut fooHandler(String p1, Exception ex) :
    cflow(fooExec(p1)) && handler(Exception) && args(ex)
    && withincode(public void foo(String));

before(String p1, Exception ex) : fooHandler(p1, ex) {
    // I can now use the variables p1 and ex.
}

编辑:

我应该指出,执行中的签名可以是**(String),两个切入点可以组合成这样一个:

pointcut fooHandler(String p1, Exception ex) :
    cflow(execution(* *(String) && args(p1))) 
    && handler(Exception) && args(ex)
    && withincode(public void foo(String));
 类似资料:
  • 问题内容: 我正在尝试进行一些日志记录,以捕获进入我的应用程序的原始http请求。我的Java代码在SpringMVC控制器内部。我可以访问“ HttpServletRequest”对象。但是我找不到从中获取原始http请求流的方法。有读者,但只阅读帖子内容。我想要的是整个shebang,URL,标题,正文。是否有捷径可寻? 提前致谢。 问题答案: 不,servlet不提供要获取原始请求的api-

  • 有什么方法可以获得它吗?因为我需要在应用程序内的对话框窗口中显示它。推送通知不仅仅是文本和标题,它对用户来说不仅仅是信息,它还会起到一定的作用。 在中接收通知标题、正文和有效负载: 正在从内部的附加程序捕获有效负载

  • 我试图得到旋转的纹理“实际上是旋转的四边形”。我能够得到纹理图像: GL_TEXTURE_2D,GL_RGBA,GL_UNSIGNED_BYTE,pxData 我想用where是一个对象的数据创建一个矩阵来实现像素完美碰撞,这个矩阵将是一个使用shift的位矩阵,但是我会给我的图像添加旋转,所以我想知道是否有办法从opengl获得旋转的纹理矩阵。 如果我使用glGetTexImage(GL_纹理_

  • 我试图用Jetpack Compose创建一个闪屏。我创建了我的导航,我有我所有的id去不同的屏幕,但我不能让一个屏幕导航到另一个Hadler内部。你们是怎么做到的?

  • 我想知道是否有一种方法,使通知弹出状态栏上方,像传统的祝酒词消息,当第一次收到。默认情况下,当收到通知时,通知标签会显示在状态栏中,并暂时隐藏其他通知图标(如果有的话),直到通知标签显示完毕。然后,通知图标通常被添加到等待用户交互的图标的水平列表中。我想要最初的接收报价只是上升到状态栏之上,然后添加图标与其余的他们。

  • 我正在使用Spring AOP实现自定义注释处理。我有下面的代码。 //应用程序配置 出于测试目的,我创建了下面的bean 无论何时启动应用程序,它都将调用TestCacheDemo类的test方法,并将定时器设置为在3秒后触发,这样我就可以从timer任务的run方法内部调用带注释的方法getCacheValue。但是当调用带注释的方法时,不会调用注释处理器。因此,我无法进行注释处理。请让我知道