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

Spring AOP-过程连接点-方法签名向下转换

曹恩
2023-03-14

有没有一种方法可以从ProceedingJoinPoint获取MethodSignature而不进行向下转换?

    private String toEventString(ProceedingJoinPoint pjp) {
    MethodSignature methodSignature = ((MethodSignature)pjp.getSignature());

    StringBuilder sb = new StringBuilder();

    String[] paramNames = methodSignature.getParameterNames();
    Class[] paramTypes = methodSignature.getParameterTypes();

    sb.append(methodSignature.getName()).append('(');

    for(int i = 0; i < paramNames.length; i++) {
        sb
            .append(paramTypes[i].getSimpleName())
            .append(" ")
            .append(paramNames[i]);
        if(i < paramNames.length - 1) {
            sb.append(", ");
        }
    }

    return sb.append(" )").toString();

}

共有1个答案

咸亦
2023-03-14

简单的问题,简单的回答:不。

更新:也许您想知道为什么需要强制转换。除了方法签名之外,还有其他签名类型吗?哦,是的,有。例如。如果您在(某个类)中使用,您可能会遇到以下任何签名类型:

  • 方法
  • 构造函数
  • 类初始值设定项
  • 字段
  • 执行建议
  • catch子句
  • 锁定/解锁(一种相当特殊的情况,如果使用<code>-Xjoinpoints:synchronization</code>编译方面,则捕获同步块)

这里有一个小例子:

驱动程序应用:

package de.scrum_master.app;

public class Application {
  private String name;

  public Application(String name) {
    this.name = name;
  }

  public static void main(String[] args) {
    Application application = new Application("my app");
    synchronized (application) {
      try {
        application.doSomething("foo", 11, false);
      }
      catch (RuntimeException e) {}
    }
  }

  private void doSomething(String string, int i, boolean b) {
    throw new RuntimeException("oops");
  }
}

应拦截其建议执行的方面:

package de.scrum_master.aspect;

public aspect MyOtherAspect {
  before() : execution(* main(..)) {}
}

方面打印签名类型:

package de.scrum_master.aspect;

import de.scrum_master.app.Application;

public aspect MyAspect {
  before() : within(Application) || within(MyOtherAspect) {
    System.out.println(thisJoinPoint);
    System.out.println("    " + thisJoinPoint.getSignature().getClass().getSimpleName());
  }
}

控制台日志:

staticinitialization(de.scrum_master.app.Application.<clinit>)
    InitializerSignatureImpl
staticinitialization(de.scrum_master.aspect.MyOtherAspect.<clinit>)
    InitializerSignatureImpl
preinitialization(de.scrum_master.aspect.MyOtherAspect())
    ConstructorSignatureImpl
initialization(de.scrum_master.aspect.MyOtherAspect())
    ConstructorSignatureImpl
execution(de.scrum_master.aspect.MyOtherAspect())
    ConstructorSignatureImpl
adviceexecution(void de.scrum_master.aspect.MyOtherAspect.before())
    AdviceSignatureImpl
execution(void de.scrum_master.app.Application.main(String[]))
    MethodSignatureImpl
call(de.scrum_master.app.Application(String))
    ConstructorSignatureImpl
preinitialization(de.scrum_master.app.Application(String))
    ConstructorSignatureImpl
initialization(de.scrum_master.app.Application(String))
    ConstructorSignatureImpl
execution(de.scrum_master.app.Application(String))
    ConstructorSignatureImpl
set(String de.scrum_master.app.Application.name)
    FieldSignatureImpl
lock(lock(Object))
    LockSignatureImpl
call(void de.scrum_master.app.Application.doSomething(String, int, boolean))
    MethodSignatureImpl
execution(void de.scrum_master.app.Application.doSomething(String, int, boolean))
    MethodSignatureImpl
call(java.lang.RuntimeException(String))
    ConstructorSignatureImpl
handler(catch(RuntimeException))
    CatchClauseSignatureImpl
unlock(unlock(Object))
    UnlockSignatureImpl

顺便说一句,这些 *Impl 类中的每一个都实现了相应的签名接口。

 类似资料:
  • 主要内容:读者,前提条件,Spring AOP 概述Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。 读者 本教程主要是为Spring 面向方面编程(AOP)初学者准备的,帮助他们了解与Spring的AOP框架相关的基础到高级概念。 前提条件 在开始练习本教程系列文章中给出的各种类型的示例之前,我们假设您已经了解

  • 我有以下注释。 在上面的类中,我在@MyAnnoting中传递了“ABC”。现在我如何在某些spect.java类的程序方法中访问“ABC”值? 谢谢

  • 我使用的是Spring4.3。是否可能获得传递给它的方法参数名和值?我相信这可以做到使用AOP(之前的建议),如果可能的话,你可以给我一个源代码。

  • 问题内容: 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以通过使用本地计算机上的curl来访问Kibana和Elastic search 我得到以下回应 var hashRoute =’/ app / kibana’; var defaultRoute =’/ app / kibana’; var hash = window.location.hash;

  • 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以使用 我得到以下回应 var hashRoute='/app/kibana'; var defaultRoute='/app/kibana'; var hash=window.location.hash; if(hash.length){window.location=hashRoute hash;}其他{wi

  • 7.1.1 面向过程观点 我们用一个简单程序来说明传统程序设计的思维方式。 【程序 7.1】eg7_1.py x = 1 y = 2 z = x + y print z 到目前为止,我们在编程时基本上都是这样思考的:先用特定数据类型的常量或变量来 表示数据(如程序 7.1 中分别存入变量 x 和 y 的整数类型值 1 和 2),然后再利用合适的操作(如程序 7.1 中的加法运算“+”)按一定的