View Javadoc

    1   /***************************************************************************************
    2    * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved.                 *
    3    * http://aspectwerkz.codehaus.org                                                    *
    4    * ---------------------------------------------------------------------------------- *
    5    * The software in this package is published under the terms of the LGPL license      *
    6    * a copy of which has been included with this distribution in the license.txt file.  *
    7    **************************************************************************************/
    8   package org.codehaus.aspectwerkz.joinpoint.impl;
    9
    10  import org.codehaus.aspectwerkz.joinpoint.MethodRtti;
    11  import org.codehaus.aspectwerkz.joinpoint.Rtti;
    12
    13  import java.lang.ref.WeakReference;
    14  import java.lang.reflect.Method;
    15
    16  /***
    17   * Implementation for the method signature.
    18   *
    19   * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
    20   */
    21  public class MethodRttiImpl implements MethodRtti {
    22      private static final Object[] EMPTY_OBJECT_ARRAY = new Object[]{};
    23
    24      private final MethodSignatureImpl m_signature;
    25
    26      private WeakReference m_thisRef;
    27
    28      private WeakReference m_targetRef;
    29
    30      private Object[] m_parameterValues = EMPTY_OBJECT_ARRAY;
    31
    32      private Object m_returnValue;
    33
    34      /***
    35       * Creates a new method RTTI.
    36       *
    37       * @param signature
    38       * @param thisInstance
    39       * @param targetInstance
    40       */
    41      public MethodRttiImpl(final MethodSignatureImpl signature, final Object thisInstance, final Object targetInstance) {
    42          m_signature = signature;
    43          m_thisRef = new WeakReference(thisInstance);
    44          m_targetRef = new WeakReference(targetInstance);
    45      }
    46
    47      /***
    48       * Clones the RTTI instance.
    49       *
    50       * @param thisInstance
    51       * @param targetInstance
    52       * @return
    53       */
    54      public Rtti cloneFor(final Object thisInstance, final Object targetInstance) {
    55          return new MethodRttiImpl(m_signature, thisInstance, targetInstance);
    56      }
    57
    58      /***
    59       * Returns the target instance.
    60       *
    61       * @return the target instance
    62       */
    63      public Object getTarget() {
    64          return m_targetRef.get();
    65      }
    66
    67      /***
    68       * Returns the instance currently executing.
    69       *
    70       * @return the instance currently executing
    71       */
    72      public Object getThis() {
    73          return m_thisRef.get();
    74      }
    75
    76      /***
    77       * Returns the method.
    78       *
    79       * @return the method
    80       */
    81      public Method getMethod() {
    82          return m_signature.getMethod();
    83      }
    84
    85      /***
    86       * Returns the declaring class.
    87       *
    88       * @return the declaring class
    89       */
    90      public Class getDeclaringType() {
    91          return m_signature.getDeclaringType();
    92      }
    93
    94      /***
    95       * Returns the modifiers for the signature. <p/>Could be used like this:
    96       * <p/>
    97       * <pre>
    98       * boolean isPublic = java.lang.reflect.Modifier.isPublic(signature.getModifiers());
    99       * </pre>
    100      *
    101      * @return the mofifiers
    102      */
    103     public int getModifiers() {
    104         return m_signature.getModifiers();
    105     }
    106
    107     /***
    108      * Returns the name (f.e. name of method of field).
    109      *
    110      * @return
    111      */
    112     public String getName() {
    113         return m_signature.getName();
    114     }
    115
    116     /***
    117      * Returns the exception types declared by the code block.
    118      *
    119      * @return the exception types
    120      */
    121     public Class[] getExceptionTypes() {
    122         return m_signature.getExceptionTypes();
    123     }
    124
    125     /***
    126      * Returns the parameter types.
    127      *
    128      * @return the parameter types
    129      */
    130     public Class[] getParameterTypes() {
    131         return m_signature.getParameterTypes();
    132     }
    133
    134     /***
    135      * Sets the values of the parameters.
    136      *
    137      * @param parameterValues
    138      */
    139     public void setParameterValues(final Object[] parameterValues) {
    140         m_parameterValues = parameterValues;
    141     }
    142
    143     /***
    144      * Returns the values of the parameters.
    145      *
    146      * @return the values of the parameters
    147      */
    148     public Object[] getParameterValues() {
    149         return m_parameterValues;
    150     }
    151
    152     /***
    153      * Returns the return type.
    154      *
    155      * @return the return type
    156      */
    157     public Class getReturnType() {
    158         return m_signature.getReturnType();
    159     }
    160
    161     /***
    162      * Sets the return value.
    163      *
    164      * @param returnValue the return value
    165      */
    166     public void setReturnValue(final Object returnValue) {
    167         m_returnValue = returnValue;
    168     }
    169
    170     /***
    171      * Returns the value of the return type.
    172      *
    173      * @return the value of the return type
    174      */
    175     public Object getReturnValue() {
    176         return m_returnValue;
    177     }
    178
    179     /***
    180      * Returns a string representation of the signature.
    181      *
    182      * @return a string representation
    183      * @TODO: implement toString to something meaningful
    184      */
    185     public String toString() {
    186         return super.toString();
    187     }
    188 }