【发布时间】:2017-07-18 20:29:22
【问题描述】:
有没有办法从 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();
}
【问题讨论】:
-
旁注:
StringJoiner可以简化您的代码。 -
另一个旁注:我已经使用 AspectJ 很长时间了。如果您可以只记录
thisJoinPoint或thisJoinPoint.getSignature(),我从来没有真正理解记录变量名称和构造复杂签名字符串的动机。它只会使代码变得缓慢和混乱。切面不能替代调试器,尤其是在生产环境中使用时。但好吧,这是一个品味问题。我的碰巧不一样。这个问题仍然有效,这就是我回答它的原因。 -
@kriegaex 这样做的目的是记录应用程序特定层的所有方法调用。签名没有提供参数名称,这使得日志语句模棱两可。
-
如果你想一分钟你之前的陈述,你会发现它是错误的。方法签名由其参数类型唯一定义,将其与任何给定类的所有其他同名方法区分开来。参数名称与识别方法完全无关,没有歧义。如果您说它是眼睛糖果,而您的大脑只是发现它更易于阅读,那很好。但是没有参数名称就模棱两可:没有。
-
参数对于日志使用者来说是模棱两可的,他们可能对应用程序没有深入的了解。日志使用者不必参考我的源代码来理解参数。如果这些值正在被 ELK 堆栈或类似的东西使用,则参数名称非常重要。
标签: java spring aspectj spring-aop