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