aspect学习(2)target&thisJoinPoint
来源:互联网 发布:轩辕剑神足进阶数据 编辑:程序博客网 时间:2024/06/05 19:54
在上一篇文章中我们学习了aspect的before/after/around的基础,现在接着学习,仍然是需求驱动学习,接着上一篇。
需求三
在需求一的基础上增加,当调用setX,setY,setZ方法时,打印属性x,y,z改变前后的值。
想要知道x,y,z改变前的值,那么在LogAspect.aj中必须要能拿到目标对象的实例、当前调用的是目标对象中的哪个方法(为什么只需知道这2个东东就可以了呢?大家可以先想想。。。。)
那么该怎样拿到目标对象实例呢?看代码
LogAspect.aj的代码
package com.fei.aspect;import org.aspectj.lang.Signature;import com.fei.bean.Point;public aspect LogAspect {public pointcut printLog(Object p): call( void Point.set*(int)) && target(p);void around(Object p):printLog(p){System.out.println(p);System.out.println(thisJoinPoint.getTarget());System.out.println(thisJoinPoint.getKind());for(Object o : thisJoinPoint.getArgs())System.out.println(o);System.out.println( "signature========");Signature signature = thisJoinPoint.getSignature();System.out.println(signature.getClass());System.out.println(signature.getName());System.out.println(signature.getDeclaringTypeName());System.out.println(signature.getModifiers());System.out.println(signature.toLongString());}}
MainTest.java源码及运行结果截图
通过上面源码及结果我们知道,要想拿到目标对象实例,有2中途径,一是在 pointcut中用target,二是直接用thisJoinPoint.getTarget()拿到,方法名可用signature.getName()拿到。
好了,我们需要的东东可以拿到了,下面源码来实现需求。
package com.fei.aspect;import java.lang.reflect.Method;import org.aspectj.lang.Signature;import com.fei.bean.Point;public aspect LogAspect {public pointcut printLog(): call( void Point.set*(int));void around():printLog(){Object o = thisJoinPoint.getTarget();Signature signature = thisJoinPoint.getSignature();String methodName = signature.getName();//System.out.println("在调用"+signature.getDeclaringTypeName()+"."+signature.getName());System.out.println("在调用"+signature.toLongString());//通过反射拿值System.out.println("属性改变前:" + getXXX(o,methodName));proceed();//通过反射拿值System.out.println("属性改变后:" + getXXX(o,methodName));}private Object getXXX(Object o, String methodName){Object value = null;try {Method m = o.getClass().getMethod(methodName.replace("set", "get"), null);value = m.invoke(o, null);} catch (Exception e) {e.printStackTrace();} return value;}}
0 0
- aspect学习(2)target&thisJoinPoint
- aspect学习(2)target&thisJoinPoint
- aspect学习(1)before&after&around
- aspect学习(1)before&after&around
- Spring学习 Aspect
- HGE学习(2) Target
- Aspect
- @Aspect
- Aspect
- Aspect
- @Aspect
- Masonry学习之aspect fit
- 面向切面编程(AOP:Aspect Orient Programming)2
- AOP(Aspect-Oriented Programming)
- AspectJ 学习笔记:Aspect的生命周期
- Second-generation aspect-oriented programming (2)
- AOP(Aspect-Oriented Programming)重要吗?
- 用@Aspect注解创建AOP(转)
- emacs search(字符串搜索)
- 如何做页面自动刷新,又不用让用户按回车键来提交数据!
- 循环不变式
- 走进AngularJs(八) ng的路由机制
- 利用httpclient4.3.1,用户名,密码,访问远程数据。
- aspect学习(2)target&thisJoinPoint
- scanf(), getchar(), 以及gets(),空白符以及输入缓冲区的问题
- day 1
- Java之控制程序流程
- 走进AngularJs(九)表单及表单验证
- eclipse中jsp文件的格式化
- 【光晕动画】
- 双代号网络图
- Android的SQlite先天不足:删除 插入后主键不能自动排序 解决(附:SQlite开发的完整demo)