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.reflect.impl.java;
9
10 import org.codehaus.aspectwerkz.annotation.Annotations;
11 import org.codehaus.aspectwerkz.reflect.ClassInfo;
12 import org.codehaus.aspectwerkz.reflect.FieldInfo;
13 import org.codehaus.aspectwerkz.reflect.ReflectHelper;
14
15 import java.lang.reflect.Field;
16 import java.util.List;
17
18 /***
19 * Implementation of the FieldInfo interface for java.lang.reflect.*.
20 *
21 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
22 */
23 public class JavaFieldInfo extends JavaMemberInfo implements FieldInfo {
24 /***
25 * The field type.
26 */
27 private ClassInfo m_type = null;
28
29 /***
30 * The signature of the field.
31 */
32 private String m_signature;
33
34 /***
35 * Creates a new field java instance.
36 *
37 * @param field
38 * @param declaringType
39 */
40 JavaFieldInfo(final Field field, final JavaClassInfo declaringType) {
41 super(field, declaringType);
42 m_signature = ReflectHelper.getFieldSignature(field);
43 }
44
45 /***
46 * Returns the field info for the field specified.
47 *
48 * @param field the field
49 * @return the field info
50 */
51 public static FieldInfo getFieldInfo(final Field field) {
52 Class declaringClass = field.getDeclaringClass();
53 JavaClassInfoRepository repository = JavaClassInfoRepository.getRepository(declaringClass.getClassLoader());
54 ClassInfo classInfo = repository.getClassInfo(declaringClass.getName());
55 if (classInfo == null) {
56 classInfo = JavaClassInfo.getClassInfo(declaringClass);
57 }
58 return classInfo.getField(ReflectHelper.calculateHash(field));
59 }
60
61 /***
62 * Returns the signature for the element.
63 *
64 * @return the signature for the element
65 */
66 public String getSignature() {
67 return m_signature;
68 }
69
70 /***
71 * Returns the annotations.
72 *
73 * @return the annotations
74 */
75 public List getAnnotations() {
76 if (m_annotations == null) {
77 m_annotations = Annotations.getAnnotationInfos((Field) m_member);
78 }
79 return m_annotations;
80 }
81
82 /***
83 * Returns the type.
84 *
85 * @return the type
86 */
87 public ClassInfo getType() {
88 if (m_type == null) {
89 Class type = ((Field) m_member).getType();
90 if (m_classInfoRepository.hasClassInfo(type.getName())) {
91 m_type = m_classInfoRepository.getClassInfo(type.getName());
92 } else {
93 m_type = JavaClassInfo.getClassInfo(type);
94 m_classInfoRepository.addClassInfo(m_type);
95 }
96 }
97 return m_type;
98 }
99
100 public boolean equals(Object o) {
101 if (this == o) {
102 return true;
103 }
104 if (!(o instanceof FieldInfo)) {
105 return false;
106 }
107 FieldInfo fieldInfo = (FieldInfo) o;
108 if (!m_declaringType.getName().equals(fieldInfo.getDeclaringType().getName())) {
109 return false;
110 }
111 if (!m_member.getName().equals(fieldInfo.getName())) {
112 return false;
113 }
114 ClassInfo fieldType = fieldInfo.getType();
115 if (!m_type.getName().equals(fieldType.getName())) {
116 return false;
117 }
118 return true;
119 }
120
121 public int hashCode() {
122 int result = 29;
123 if (m_type == null) {
124 getType();
125 }
126 result = (29 * result) + m_declaringType.getName().hashCode();
127 result = (29 * result) + m_member.getName().hashCode();
128 result = (29 * result) + getType().getName().hashCode();
129 return result;
130 }
131 }