/**************************************************************************************
* 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.asm;
import org.codehaus.aspectwerkz.reflect.ClassInfo;
import org.codehaus.aspectwerkz.reflect.FieldInfo;
import org.codehaus.aspectwerkz.transform.inlining.AsmHelper;
import org.codehaus.aspectwerkz.util.ContextClassLoader;
import org.codehaus.backport175.reader.bytecode.AnnotationReader;
import org.codehaus.backport175.reader.bytecode.AnnotationElement;
import org.codehaus.backport175.reader.Annotation;
import org.objectweb.asm.Type;
/**
* ASM implementation of the FieldInfo interface.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public class AsmFieldInfo extends AsmMemberInfo implements FieldInfo {
/**
* The field type name.
*/
private String m_typeName;
/**
* The field type.
*/
private ClassInfo m_type = null;
/**
* Creates a new field java instance.
*
* @param field
* @param declaringType
* @param loader
*/
AsmFieldInfo(final FieldStruct field, final String declaringType, final ClassLoader loader) {
super(field, declaringType, loader);
m_typeName = Type.getType(field.desc).getClassName();
}
/**
* Returns the field info for the field specified.
*
* @param fieldName
* @param fieldDesc
* @param bytecode
* @param loader
* @return the field info
*/
public static FieldInfo getFieldInfo(final String fieldName,
final String fieldDesc,
final byte[] bytecode,
final ClassLoader loader) {
String className = AsmClassInfo.retrieveClassNameFromBytecode(bytecode);
AsmClassInfoRepository repository = AsmClassInfoRepository.getRepository(loader);
ClassInfo classInfo = repository.getClassInfo(className);
if (classInfo == null) {
classInfo = AsmClassInfo.getClassInfo(bytecode, loader);
}
return classInfo.getField(AsmHelper.calculateFieldHash(fieldName, fieldDesc));
}
/**
* Returns the signature for the element.
*
* @return the signature for the element
*/
public String getSignature() {
return AsmHelper.getFieldDescriptor(this);
}
/**
* Returns the type.
*
* @return the type
*/
public ClassInfo getType() {
if (m_type == null) {
m_type = AsmClassInfo.getClassInfo(m_typeName, (ClassLoader) m_loaderRef.get());
}
return m_type;
}
/**
* Returns the annotations.
*
* @return the annotations
*/
public AnnotationElement.Annotation[] getAnnotations() {
return getDeclaringType().getAnnotationReader().getFieldAnnotationElements(m_member.name, m_member.desc);
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof FieldInfo)) {
return false;
}
FieldInfo fieldInfo = (FieldInfo) o;
if (!m_declaringTypeName.equals(fieldInfo.getDeclaringType().getName())) {
return false;
}
if (!m_member.name.equals(fieldInfo.getName())) {
return false;
}
if (!m_typeName.equals(fieldInfo.getType().getName())) {
return false;
}
return true;
}
public int hashCode() {
int result = 29;
result = (29 * result) + m_declaringTypeName.hashCode();
result = (29 * result) + m_member.name.hashCode();
result = (29 * result) + m_typeName.hashCode();
return result;
}
public String toString() {
StringBuffer sb = new StringBuffer(m_declaringTypeName);
sb.append('.').append(m_member.name).append(' ');
sb.append(m_member.desc);
return sb.toString();
}
}