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.FieldRtti;
11 import org.codehaus.aspectwerkz.joinpoint.Rtti;
12
13 import java.lang.ref.WeakReference;
14 import java.lang.reflect.Field;
15
16 /***
17 * Implementation for the field signature.
18 *
19 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
20 */
21 public class FieldRttiImpl implements FieldRtti {
22 private final FieldSignatureImpl m_signature;
23
24 private WeakReference m_thisRef;
25
26 private WeakReference m_targetRef;
27
28 private Object m_fieldValue;
29
30 /***
31 * Creates a new field RTTI.
32 *
33 * @param signature
34 * @param thisInstance
35 * @param targetInstance
36 */
37 public FieldRttiImpl(final FieldSignatureImpl signature, final Object thisInstance, final Object targetInstance) {
38 m_signature = signature;
39 m_thisRef = new WeakReference(thisInstance);
40 m_targetRef = new WeakReference(targetInstance);
41 }
42
43 /***
44 * Clones the RTTI instance.
45 *
46 * @param thisInstance
47 * @param targetInstance
48 * @return
49 */
50 public Rtti cloneFor(final Object thisInstance, final Object targetInstance) {
51 return new FieldRttiImpl(m_signature, thisInstance, targetInstance);
52 }
53
54 /***
55 * Returns the target instance.
56 *
57 * @return the target instance
58 */
59 public Object getTarget() {
60 return m_targetRef.get();
61 }
62
63 /***
64 * Returns the instance currently executing.
65 *
66 * @return the instance currently executing
67 */
68 public Object getThis() {
69 return m_thisRef.get();
70 }
71
72 /***
73 * Returns the declaring class.
74 *
75 * @return the declaring class
76 */
77 public Class getDeclaringType() {
78 return m_signature.getDeclaringType();
79 }
80
81 /***
82 * Returns the modifiers for the signature. <p/>Could be used like this:
83 * <p/>
84 * <pre>
85 * boolean isPublic = java.lang.reflect.Modifier.isPublic(signature.getModifiers());
86 * </pre>
87 *
88 * @return the mofifiers
89 */
90 public int getModifiers() {
91 return m_signature.getModifiers();
92 }
93
94 /***
95 * Returns the name (f.e. name of method of field).
96 *
97 * @return the name
98 */
99 public String getName() {
100 return m_signature.getName();
101 }
102
103 /***
104 * Returns the field.
105 *
106 * @return the field
107 */
108 public Field getField() {
109 return m_signature.getField();
110 }
111
112 /***
113 * Returns the field type.
114 *
115 * @return the field type
116 */
117 public Class getFieldType() {
118 return m_signature.getFieldType();
119 }
120
121 /***
122 * Returns the value of the field.
123 *
124 * @return the value of the field
125 */
126 public Object getFieldValue() {
127 return m_fieldValue;
128 }
129
130 /***
131 * Sets the value of the field.
132 *
133 * @param fieldValue the value of the field
134 */
135 public void setFieldValue(final Object fieldValue) {
136 m_fieldValue = fieldValue;
137 }
138
139 /***
140 * Returns a string representation of the signature.
141 *
142 * @return a string representation
143 * @TODO: implement toString to something meaningful
144 */
145 public String toString() {
146 return super.toString();
147 }
148
149 /***
150 * TODO: Needed for stupid JIT compiler. Remove for 2.0.
151 *
152 * @return
153 */
154 public Object[] getParameterValues() {
155 return new Object[]{m_fieldValue};
156 }
157 }