Java Spring AOP-处理连接点-方法签名向下广播
有没有一种方法可以在不向下转换的情况下从ProceedingJoinPoint获取MethodSignatureJava 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
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。