Joint Point

JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。
通过JointPoint对象可以获取到下面信息

  1. 返回目标对象,即被代理的对象
  2. Object getTarget();
  3. 返回切入点的参数
  4. Object[] getArgs();
  5. 返回切入点的Signature
  6. Signature getSignature();
  7. 返回切入的类型,比如method-callfield-get等等,感觉不重要
  8. String getKind();

JointPoint使用详解

这里详细介绍JointPoint的方法,这部分很重要是coding核心参考部分。开始之前我们思考一下,我们到底需要获取切入点的那些信息。我的思考如下:
切入点的方法名字及其参数
切入点方法标注的注解对象(通过该对象可以获取注解信息)
切入点目标对象(可以通过反射获取对象的类名,属性和方法名)
注:有一点非常重要,Spring的AOP只能支持到方法级别的切入。换句话说,切入点只能是某个方法。

针对以上的需求JDK提供了如下API

1. 获取切入点所在目标对象

  1. Object targetObj =joinPoint.getTarget();
  2. # 可以发挥反射的功能获取关于类的任何信息,例如获取类名如下
  3. String className = joinPoint.getTarget().getClass().getName();

因为一个类有很多方法,为了获取具体切入点所在的方法可以通过如下API

2.获取切入点方法的名字

getSignature());是获取到这样的信息 :修饰符+ 包名+组件名(类名) +方法名
这里我只需要方法名

  1. String methodName = joinPoint.getSignature().getName()

3. 获取方法上的注解

方法1:xxxxxx是注解名字

  1. Signature signature = joinPoint.getSignature();
  2. MethodSignature methodSignature = (MethodSignature) signature;
  3. Method method = methodSignature.getMethod();
  4. if (method != null)
  5. {
  6. xxxxxx annoObj= method.getAnnotation(xxxxxx.class);
  7. }
  8. return null;

方法2:上面我们已经知道了方法名和类的对象,通过反射可以获取类的内部任何信息。

  1. // 切面所在类
  2. Object target = joinPoint.getTarget();
  3. String methodName = joinPoint.getSignature().getName();
  4. Method method = null;
  5. for (Method m : target.getClass().getMethods()) {
  6. if (m.getName().equals(methodName)) {
  7. method = m;
  8. // xxxxxx annoObj= method.getAnnotation(xxxxxx.class);同上
  9. break;
  10. }
  11. }

4. 获取方法的参数

这里返回的是切入点方法的参数列表

  1. Object[] args = joinPoint.getArgs();

Pointcut

pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。
pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut当做jointpoint的集合。