org.springframework.aop.framework
Class ReflectiveMethodInvocation

java.lang.Object
  extended by org.springframework.aop.framework.ReflectiveMethodInvocation
All Implemented Interfaces:
java.lang.Cloneable, ProxyMethodInvocation
Direct Known Subclasses:
Cglib2AopProxy.CglibMethodInvocation

public class ReflectiveMethodInvocation
extends java.lang.Object
implements ProxyMethodInvocation, java.lang.Cloneable

Spring's implementation of the AOP Alliance org.aopalliance.intercept.MethodInvocation interface, implementing the extended ProxyMethodInvocation interface.

Invokes the target object using reflection. Subclasses can override the invokeJoinpoint() method to change this behavior, so this is also a useful base class for more specialized MethodInvocation implementations.

It is possible to clone an invocation, to invoke proceed() repeatedly (once per clone), using the invocableClone() method. It is also possible to attach custom attributes to the invocation, using the setUserAttribute(java.lang.String, java.lang.Object) / getUserAttribute(java.lang.String) methods.

NOTE: This class is considered internal and should not be directly accessed. The sole reason for it being public is compatibility with existing framework integrations (e.g. Pitchfork). For any other purposes, use the ProxyMethodInvocation interface instead.

Author:
Rod Johnson, Juergen Hoeller, Adrian Colyer
See Also:
invokeJoinpoint(), proceed(), invocableClone(), setUserAttribute(java.lang.String, java.lang.Object), getUserAttribute(java.lang.String)

Field Summary
protected  java.lang.Object[] arguments
           
private  int currentInterceptorIndex
          Index from 0 of the current interceptor we're invoking.
protected  java.util.List interceptorsAndDynamicMethodMatchers
          List of MethodInterceptor and InterceptorAndDynamicMethodMatcher that need dynamic checks.
protected  java.lang.reflect.Method method
           
protected  java.lang.Object proxy
           
protected  java.lang.Object target
           
private  java.lang.Class targetClass
           
private  java.util.Map<java.lang.String,java.lang.Object> userAttributes
          Lazily initialized map of user-specific attributes for this invocation.
 
Constructor Summary
protected ReflectiveMethodInvocation(java.lang.Object proxy, java.lang.Object target, java.lang.reflect.Method method, java.lang.Object[] arguments, java.lang.Class targetClass, java.util.List<java.lang.Object> interceptorsAndDynamicMethodMatchers)
          Construct a new ReflectiveMethodInvocation with the given arguments.
 
Method Summary
 java.lang.Object[] getArguments()
           
 java.lang.reflect.Method getMethod()
          Return the method invoked on the proxied interface.
 java.lang.Object getProxy()
          Return the proxy that this method invocation was made through.
 java.lang.reflect.AccessibleObject getStaticPart()
           
 java.lang.Object getThis()
           
 java.lang.Object getUserAttribute(java.lang.String key)
          Return the value of the specified user attribute.
 java.util.Map<java.lang.String,java.lang.Object> getUserAttributes()
          Return user attributes associated with this invocation.
 MethodInvocation invocableClone()
          This implementation returns a shallow copy of this invocation object, including an independent copy of the original arguments array.
 MethodInvocation invocableClone(java.lang.Object[] arguments)
          This implementation returns a shallow copy of this invocation object, using the given arguments array for the clone.
protected  java.lang.Object invokeJoinpoint()
          Invoke the joinpoint using reflection.
 java.lang.Object proceed()
           
 void setArguments(java.lang.Object[] arguments)
          Set the arguments to be used on subsequent invocations in the any advice in this chain.
 void setUserAttribute(java.lang.String key, java.lang.Object value)
          Add the specified user attribute with the given value to this invocation.
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

proxy

protected final java.lang.Object proxy

target

protected final java.lang.Object target

method

protected final java.lang.reflect.Method method

arguments

protected java.lang.Object[] arguments

targetClass

private final java.lang.Class targetClass

userAttributes

private java.util.Map<java.lang.String,java.lang.Object> userAttributes
Lazily initialized map of user-specific attributes for this invocation.


interceptorsAndDynamicMethodMatchers

protected final java.util.List interceptorsAndDynamicMethodMatchers
List of MethodInterceptor and InterceptorAndDynamicMethodMatcher that need dynamic checks.


currentInterceptorIndex

private int currentInterceptorIndex
Index from 0 of the current interceptor we're invoking. -1 until we invoke: then the current interceptor.

Constructor Detail

ReflectiveMethodInvocation

protected ReflectiveMethodInvocation(java.lang.Object proxy,
                                     java.lang.Object target,
                                     java.lang.reflect.Method method,
                                     java.lang.Object[] arguments,
                                     java.lang.Class targetClass,
                                     java.util.List<java.lang.Object> interceptorsAndDynamicMethodMatchers)
Construct a new ReflectiveMethodInvocation with the given arguments.

Parameters:
proxy - the proxy object that the invocation was made on
target - the target object to invoke
method - the method to invoke
arguments - the arguments to invoke the method with
targetClass - the target class, for MethodMatcher invocations
interceptorsAndDynamicMethodMatchers - interceptors that should be applied, along with any InterceptorAndDynamicMethodMatchers that need evaluation at runtime. MethodMatchers included in this struct must already have been found to have matched as far as was possibly statically. Passing an array might be about 10% faster, but would complicate the code. And it would work only for static pointcuts.
Method Detail

getProxy

public final java.lang.Object getProxy()
Description copied from interface: ProxyMethodInvocation
Return the proxy that this method invocation was made through.

Specified by:
getProxy in interface ProxyMethodInvocation
Returns:
the original proxy object

getThis

public final java.lang.Object getThis()

getStaticPart

public final java.lang.reflect.AccessibleObject getStaticPart()

getMethod

public final java.lang.reflect.Method getMethod()
Return the method invoked on the proxied interface. May or may not correspond with a method invoked on an underlying implementation of that interface.


getArguments

public final java.lang.Object[] getArguments()

setArguments

public void setArguments(java.lang.Object[] arguments)
Description copied from interface: ProxyMethodInvocation
Set the arguments to be used on subsequent invocations in the any advice in this chain.

Specified by:
setArguments in interface ProxyMethodInvocation
Parameters:
arguments - the argument array

proceed

public java.lang.Object proceed()
                         throws java.lang.Throwable
Throws:
java.lang.Throwable

invokeJoinpoint

protected java.lang.Object invokeJoinpoint()
                                    throws java.lang.Throwable
Invoke the joinpoint using reflection. Subclasses can override this to use custom invocation.

Returns:
the return value of the joinpoint
Throws:
java.lang.Throwable - if invoking the joinpoint resulted in an exception

invocableClone

public MethodInvocation invocableClone()
This implementation returns a shallow copy of this invocation object, including an independent copy of the original arguments array.

We want a shallow copy in this case: We want to use the same interceptor chain and other object references, but we want an independent value for the current interceptor index.

Specified by:
invocableClone in interface ProxyMethodInvocation
Returns:
an invocable clone of this invocation. proceed() can be called once per clone.
See Also:
Object.clone()

invocableClone

public MethodInvocation invocableClone(java.lang.Object[] arguments)
This implementation returns a shallow copy of this invocation object, using the given arguments array for the clone.

We want a shallow copy in this case: We want to use the same interceptor chain and other object references, but we want an independent value for the current interceptor index.

Specified by:
invocableClone in interface ProxyMethodInvocation
Parameters:
arguments - the arguments that the cloned invocation is supposed to use, overriding the original arguments
Returns:
an invocable clone of this invocation. proceed() can be called once per clone.
See Also:
Object.clone()

setUserAttribute

public void setUserAttribute(java.lang.String key,
                             java.lang.Object value)
Description copied from interface: ProxyMethodInvocation
Add the specified user attribute with the given value to this invocation.

Such attributes are not used within the AOP framework itself. They are just kept as part of the invocation object, for use in special interceptors.

Specified by:
setUserAttribute in interface ProxyMethodInvocation
Parameters:
key - the name of the attribute
value - the value of the attribute, or null to reset it

getUserAttribute

public java.lang.Object getUserAttribute(java.lang.String key)
Description copied from interface: ProxyMethodInvocation
Return the value of the specified user attribute.

Specified by:
getUserAttribute in interface ProxyMethodInvocation
Parameters:
key - the name of the attribute
Returns:
the value of the attribute, or null if not set
See Also:
ProxyMethodInvocation.setUserAttribute(java.lang.String, java.lang.Object)

getUserAttributes

public java.util.Map<java.lang.String,java.lang.Object> getUserAttributes()
Return user attributes associated with this invocation. This method provides an invocation-bound alternative to a ThreadLocal.

This map is initialized lazily and is not used in the AOP framework itself.

Returns:
any user attributes associated with this invocation (never null)

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object