Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP-处理连接点-方法签名向下广播_Java_Spring_Aspectj_Spring Aop - Fatal编程技术网

Java Spring AOP-处理连接点-方法签名向下广播

Java Spring AOP-处理连接点-方法签名向下广播,java,spring,aspectj,spring-aop,Java,Spring,Aspectj,Spring Aop,有没有一种方法可以在不向下转换的情况下从ProceedingJoinPoint获取MethodSignature private String toEventString(ProceedingJoinPoint pjp) { MethodSignature methodSignature = ((MethodSignature)pjp.getSignature()); StringBuilder sb = new StringBuilder(); String

有没有一种方法可以在不向下转换的情况下从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();

}
private String到ventstring(ProceedingJoinPoint pjp){
MethodSignature MethodSignature=((MethodSignature)pjp.getSignature());
StringBuilder sb=新的StringBuilder();
字符串[]paramNames=methodSignature.getParameterNames();
类[]paramTypes=methodSignature.getParameterTypes();
sb.append(methodSignature.getName()).append('(');
for(int i=0;i
简单的问题,简单的回答:不

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

  • 方法
  • 建造师
  • 类初始值设定项
  • 建议执行
  • 捕获条款
  • 锁定/解锁(相当特殊的情况,如果使用
    -Xjoinpoints:synchronization
    编译方面,则捕获同步块)
下面是一个小例子:

驱动程序应用程序:

package de.scrum\u master.app;
公共类应用程序{
私有字符串名称;
公共应用程序(字符串名称){
this.name=名称;
}
公共静态void main(字符串[]args){
应用程序=新应用程序(“我的应用程序”);
已同步(应用程序){
试一试{
应用程序。doSomething(“foo”,11,false);
}
catch(运行时异常e){}
}
}
私有void doSomething(字符串、int i、布尔b){
抛出新的运行时异常(“oops”);
}
}
应该拦截其通知执行的方面:

package de.scrum\u master.aspect;
公共方面{
before():执行(*main(..){}
}
方面打印签名类型:

package de.scrum\u master.aspect;
导入de.scrum_master.app.Application;
公共方面我的方面{
before():在(应用程序)内| |在(MyOtherAspect)内{
System.out.println(此连接点);
System.out.println(“+thisJoinPoint.getSignature().getClass().getSimpleName());
}
}
控制台日志:

staticinitialization(de.scrum\u master.app.Application.)
InitializerSignatureImpl
静态初始化(de.scrum\u master.aspect.MyOtherAspect)
InitializerSignatureImpl
预初始化(de.scrum\u master.aspect.MyOtherAspect())
构造函数签名EMPL
初始化(de.scrum\u master.aspect.MyOtherAspect())
构造函数签名EMPL
执行(de.scrum\u master.aspect.MyOtherAspect())
构造函数签名EMPL
adviceexecution(void de.scrum\u master.aspect.MyOtherAspect.before())
AdviceSignatureImpl
执行(void de.scrum_master.app.Application.main(String[]))
方法签名
调用(de.scrum_master.app.Application(字符串))
构造函数签名EMPL
预初始化(de.scrum\u master.app.Application(字符串))
构造函数签名EMPL
初始化(de.scrum_master.app.Application(字符串))
构造函数签名EMPL
执行(de.scrum_master.app.Application(字符串))
构造函数签名EMPL
set(String de.scrum\u master.app.Application.name)
FieldSignatureImpl
锁(锁(对象))
锁签名
调用(void de.scrum_master.app.Application.doSomething(字符串、整数、布尔))
方法签名
执行(void de.scrum_master.app.Application.doSomething(字符串、int、布尔))
方法签名
调用(java.lang.RuntimeException(字符串))
构造函数签名EMPL
处理程序(捕获(运行时异常))
CatchClauseSignatureImpl
解锁(解锁(对象))
解锁SignatureImpl

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

旁注:可能会简化代码。另一个旁注:我已经使用AspectJ很长时间了。如果您只需记录
thisJoinPoint
thisJoinPoint.getSignature()
,我就永远无法真正理解记录变量名和构造复杂签名字符串的动机。这只会使代码变得缓慢和混乱。方面不是调试器的替代品,尤其是在生产中使用时。但是,这是一个品味的问题。我的正好不同。这个问题仍然有效,这就是我回答它的原因。@kriegaex这样做的目的是记录应用程序特定层上的所有方法调用。签名不提供参数名,这使得日志语句模棱两可。如果您想一想您以前的语句,就会发现它是错误的。方法签名由其参数类型唯一定义,区别于任何给定类中同名的所有其他方法。参数名称与识别方法完全无关,不存在歧义。如果你说它很吸引人,而你的大脑发现它更容易阅读,那就好了。但是,如果没有参数名称,则不明确:否。对于日志使用者来说,参数是不明确的,因为日志使用者可能不了解应用程序。日志使用者不必引用我的源代码来理解参数。如果这些值被ELK堆栈或类似的东西使用,那么参数名非常重要。感谢今晚的失眠,我刚刚添加了一些示例代码+更多解释。享受吧!请原谅我更喜欢原生AspectJ语法。很容易转换成@AspectJ风格。非常有用,谢谢!我不知道有这么多不同的切入点。我只需要方法级AOP。