/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.reflect.impl.java;
import org.codehaus.aspectwerkz.reflect.ClassInfo;
import org.codehaus.aspectwerkz.reflect.FieldInfo;
import org.codehaus.aspectwerkz.reflect.ReflectHelper;
import org.codehaus.backport175.reader.bytecode.AnnotationElement;
import java.lang.reflect.Field;
import java.util.List;
/**
* Implementation of the FieldInfo interface for java.lang.reflect.*.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class JavaFieldInfo extends JavaMemberInfo implements FieldInfo {
/**
* The field type.
*/
private ClassInfo m_type = null;
/**
* The signature of the field.
*/
private String m_signature;
/**
* Creates a new field java instance.
*
* @param field
* @param declaringType
*/
JavaFieldInfo(final Field field, final JavaClassInfo declaringType) {
super(field, declaringType);
m_signature = ReflectHelper.getFieldSignature(field);
}
/**
* Returns the field info for the field specified.
*
* @param field the field
* @return the field info
*/
public static FieldInfo getFieldInfo(final Field field) {
Class declaringClass = field.getDeclaringClass();
JavaClassInfoRepository repository = JavaClassInfoRepository.getRepository(declaringClass.getClassLoader());
ClassInfo classInfo = repository.getClassInfo(declaringClass.getName());
if (classInfo == null) {
classInfo = JavaClassInfo.getClassInfo(declaringClass);
}
return classInfo.getField(ReflectHelper.calculateHash(field));
}
/**
* Returns the signature for the element.
*
* @return the signature for the element
*/
public String getSignature() {
return m_signature;
}
/**
* Returns the annotations.
*
* @return the annotations
*/
public AnnotationElement.Annotation[] getAnnotations() {
return getDeclaringType().getAnnotationReader().getFieldAnnotationElements(getName(), m_signature);
}
/**
* Returns the type.
*
* @return the type
*/
public ClassInfo getType() {
if (m_type == null) {
Class type = ((Field) m_member).getType();
if (m_classInfoRepository.hasClassInfo(type.getName())) {
m_type = m_classInfoRepository.getClassInfo(type.getName());
} else {
m_type = JavaClassInfo.getClassInfo(type);
m_classInfoRepository.addClassInfo(m_type);
}
}
return m_type;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof FieldInfo)) {
return false;
}
FieldInfo fieldInfo = (FieldInfo) o;
if (!m_declaringType.getName().equals(fieldInfo.getDeclaringType().getName())) {
return false;
}
if (!m_member.getName().equals(fieldInfo.getName())) {
return false;
}
ClassInfo fieldType = fieldInfo.getType();
if (!m_type.getName().equals(fieldType.getName())) {
return false;
}
return true;
}
public int hashCode() {
int result = 29;
if (m_type == null) {
getType();
}
result = (29 * result) + m_declaringType.getName().hashCode();
result = (29 * result) + m_member.getName().hashCode();
result = (29 * result) + getType().getName().hashCode();
return result;
}
}