aspect学习(2)target&thisJoinPoint

  在上一篇文章中我们学习了aspect的before/after/around的基础,现在接着学习,仍然是需求驱动学习,接着上一篇。


需求三

    在需求一的基础上增加,当调用setX,setY,setZ方法时,打印属性x,y,z改变前后的值。


     想要知道x,y,z改变前的值,那么在LogAspect.aj中必须要能拿到目标对象的实例、当前调用的是目标对象中的哪个方法(为什么只需知道这2个东东就可以了呢?大家可以先想想。。。。)

    那么该怎样拿到目标对象实例呢?看代码

LogAspect.aj的代码

[java]  view plain  copy
  1. package com.fei.aspect;  
  2.   
  3.   
  4. import org.aspectj.lang.Signature;  
  5.   
  6. import com.fei.bean.Point;  
  7.   
  8. public aspect LogAspect {  
  9.   
  10.     public pointcut printLog(Object p): call( void Point.set*(int)) && target(p);  
  11.       
  12.     void around(Object p):printLog(p){  
  13.         System.out.println(p);  
  14.         System.out.println(thisJoinPoint.getTarget());  
  15.         System.out.println(thisJoinPoint.getKind());  
  16.         for(Object o : thisJoinPoint.getArgs())  
  17.             System.out.println(o);  
  18.         System.out.println( "signature========");  
  19.         Signature signature = thisJoinPoint.getSignature();  
  20.         System.out.println(signature.getClass());  
  21.         System.out.println(signature.getName());  
  22.         System.out.println(signature.getDeclaringTypeName());  
  23.         System.out.println(signature.getModifiers());  
  24.         System.out.println(signature.toLongString());  
  25.       
  26.     }  
  27.       
  28.       
  29. }  

MainTest.java源码及运行结果截图

aspect学习(2)target&thisJoinPoint_第1张图片


     通过上面源码及结果我们知道,要想拿到目标对象实例,有2中途径,一是在 pointcut中用target,二是直接用thisJoinPoint.getTarget()拿到,方法名可用signature.getName()拿到。


   好了,我们需要的东东可以拿到了,下面源码来实现需求。

[java]  view plain  copy
  1. package com.fei.aspect;  
  2.   
  3.   
  4. import java.lang.reflect.Method;  
  5.   
  6. import org.aspectj.lang.Signature;  
  7.   
  8. import com.fei.bean.Point;  
  9.   
  10. public aspect LogAspect {  
  11.   
  12.     public pointcut printLog(): call( void Point.set*(int));  
  13.       
  14.     void around():printLog(){  
  15.         Object o = thisJoinPoint.getTarget();  
  16.         Signature signature = thisJoinPoint.getSignature();  
  17.         String methodName = signature.getName();  
  18.     //  System.out.println("在调用"+signature.getDeclaringTypeName()+"."+signature.getName());  
  19.         System.out.println("在调用"+signature.toLongString());  
  20.         //通过反射拿值  
  21.         System.out.println("属性改变前:" + getXXX(o,methodName));  
  22.         proceed();  
  23.         //通过反射拿值  
  24.         System.out.println("属性改变后:" + getXXX(o,methodName));  
  25.       
  26.     }  
  27.       
  28.     private Object getXXX(Object o, String methodName){  
  29.         Object value = null;  
  30.         try {  
  31.             Method m = o.getClass().getMethod(methodName.replace("set""get"), null);  
  32.             value = m.invoke(o, null);  
  33.         } catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }   
  36.           
  37.         return value;  
  38.     }  
  39.       
  40. }  
aspect学习(2)target&thisJoinPoint_第2张图片

你可能感兴趣的:(java,java基础,AOP)