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