有没有一种方法可以从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();
}
简单的问题,简单的回答:不。
更新:也许您想知道为什么需要强制转换。除了方法签名之外,还有其他签名类型吗?哦,是的,有。例如。如果您在(某个类)中使用,您可能会遇到以下任何签名类型:
方法
构造函数
类初始值设定项
字段
执行建议
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 中的加法运算“+”)按一定的