以下是源码中对 JoinPoint 的描述
A runtime joinpoint is an event that occurs on a static joinpoint (i.e. a location in a program). For instance, an invocation is the runtime joinpoint on a method (static joinpoint). The static part of a given joinpoint can be generically retrieved using the getStaticPart() method.
一个运行时JoinPoint就是发生在一个静态JoinPoint(静态JoinPoint可以理解为程序中的一个位置)上的事件。例如一次调用就是就发生在一个 Method(可以理解为静态JoinPoint) 的运行时JoinPoint. 一个JoinPoint的静态部分通常可以通过getStaticPart()方法获取到。
In the context of an interception framework, a runtime joinpoint is then the reification of an access to an accessible object (a method, a constructor, a field), i.e. the static part of the joinpoint. It is passed to the interceptors that are installed on the static joinpoint.
在一个拦截框架的上下文中,一个运行时JoinPoint就是对可访问对象(accessible object,例如:Method,Constructor,Field 也就是JoinPoint的静态部分)的一次具体的访问。这次具体的访问(也就是这个运行时JoinPoint)会被传递给所有注册在对应的静态JoinPoint的拦截器。
综合上述:一个JoinPoint 分为静态部分和动态部分,静态部分是不变的部分,比如JoinPoint的位置,可以是一个具体的Method,或者一个具体Constructor,无论什么时候调用这个Method,都是同一个Method,不会变。运行时部分就是每次事件(比如每次调用一个方法)有可能发生变化的部分(比如说,调用一个方法的参数,每次调用可以传不同的参数,或者执行的目标对象不同)
根据上面的理解我们来分析一下这几层接口。
1.JoinPoint这个是顶层接口,这里面只能定义一些不变的东西,也就是静态部分,所以它定义了
getStaticPart() 获取静态部分,可能是一个Method,一个Constructor,一个Field
getThis()获取当前持有静态部分的对象,比如 Method 调用的目标对象
proceed() 注释是 继续调用链中的下一个连接器,说明定义JoinPoint这个接口的目的就是要在对静态部分进行调用的时候,添加拦截
2.Invocation 这个JoinPoint的直接子类,一个 Invocation 就是一次具体的事件,除了静态部分,runtime部分也得确定下来,所以Invocation中定义了getArguments()来获取每次调用的具体参数,这是属于runtime部分,因为每次调用传的可能不一样,但是具体到某一次调用,参数是确定的
3.MethodInvocation 从签名来看,这是描述对Method进行调用的一个接口,所以它的静态部分只能是Method类型的,所以它定义了 getMethod() 来获取要调用的Method对象
4.ConstructorInvocation 从签名来看,这是描述对Constructor进行调用的一个接口,所以它的静态部分只能是Constructor类型的,所以它定义了 getConstructor() 来获取要调用的Method对象
5.ReflectiveMethodInvocation 就是用来描述一个具体的对Method进行调用的实现类,不仅实现了各层父类中定义的 getStaticPart() ,getThis(), getArguments(),getMethod() 还定义了这些信息的配置方法,还定义了配置和获取拦截器的方法。ReflectiveMethodInvocation.proceed() 的具体实现就是如果还有未调用的拦截器就继续调用下一个,如果没有下一个就调用目标对象的方法