/************************************************************************************** * 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.ConstructorInfo; import org.codehaus.aspectwerkz.reflect.ReflectHelper; import org.codehaus.aspectwerkz.reflect.ReflectHelper; import org.codehaus.backport175.reader.bytecode.AnnotationElement; import java.lang.reflect.Constructor; import java.util.List; /** * Implementation of the ConstructorInfo interface for java.lang.reflect.*. * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> */ public class JavaConstructorInfo extends JavaMemberInfo implements ConstructorInfo { /** * A list with the parameter types. */ private ClassInfo[] m_parameterTypes = null; /** * A list with the exception types. */ private ClassInfo[] m_exceptionTypes = null; /** * The signature of the class. */ private String m_signature; /** * Creates a new method meta data instance. * * @param constructor * @param declaringType */ JavaConstructorInfo(final Constructor constructor, final JavaClassInfo declaringType) { super(constructor, declaringType); m_signature = ReflectHelper.getConstructorSignature(constructor); } /** * Returns the constructor info for the constructor specified. * * @param constructor the constructor * @return the constructor info */ public static ConstructorInfo getConstructorInfo(final Constructor constructor) { Class declaringClass = constructor.getDeclaringClass(); JavaClassInfoRepository repository = JavaClassInfoRepository.getRepository(declaringClass.getClassLoader()); ClassInfo classInfo = repository.getClassInfo(declaringClass.getName()); if (classInfo == null) { classInfo = JavaClassInfo.getClassInfo(declaringClass); } return classInfo.getConstructor(ReflectHelper.calculateHash(constructor)); } /** * Returns the signature for the element. * * @return the signature for the element */ public String getSignature() { return m_signature; } /** * Returns the attributes. * * @return the attributes */ public AnnotationElement.Annotation[] getAnnotations() { return getDeclaringType().getAnnotationReader().getConstructorAnnotationElements(m_signature); } /** * Returns the parameter types. * * @return the parameter types */ public ClassInfo[] getParameterTypes() { if (m_parameterTypes == null) { Class[] parameterTypes = ((Constructor) m_member).getParameterTypes(); m_parameterTypes = new ClassInfo[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; i++) { Class parameterType = parameterTypes[i]; ClassInfo metaData; if (m_classInfoRepository.hasClassInfo(parameterType.getName())) { metaData = m_classInfoRepository.getClassInfo(parameterType.getName()); } else { metaData = JavaClassInfo.getClassInfo(parameterType); m_classInfoRepository.addClassInfo(metaData); } m_parameterTypes[i] = metaData; } } return m_parameterTypes; } /** * Returns the exception types. * * @return the exception types */ public ClassInfo[] getExceptionTypes() { if (m_exceptionTypes == null) { Class[] exceptionTypes = ((Constructor) m_member).getExceptionTypes(); m_exceptionTypes = new ClassInfo[exceptionTypes.length]; for (int i = 0; i < exceptionTypes.length; i++) { Class exceptionType = exceptionTypes[i]; ClassInfo metaData; if (m_classInfoRepository.hasClassInfo(exceptionType.getName())) { metaData = m_classInfoRepository.getClassInfo(exceptionType.getName()); } else { metaData = JavaClassInfo.getClassInfo(exceptionType); m_classInfoRepository.addClassInfo(metaData); } m_exceptionTypes[i] = metaData; } } return m_exceptionTypes; } public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof ConstructorInfo)) { return false; } ConstructorInfo constructorInfo = (ConstructorInfo) o; if (!m_declaringType.getName().equals(constructorInfo.getDeclaringType().getName())) { return false; } if (!m_member.getName().equals(constructorInfo.getName())) { return false; } Class[] parameterTypes1 = ((Constructor) m_member).getParameterTypes(); ClassInfo[] parameterTypes2 = constructorInfo.getParameterTypes(); if (parameterTypes1.length != parameterTypes2.length) { return false; } for (int i = 0; i < parameterTypes1.length; i++) { if (!parameterTypes1[i].getName().equals(parameterTypes2[i].getName())) { return false; } } return true; } public int hashCode() { int result = 29; result = (29 * result) + m_declaringType.getName().hashCode(); result = (29 * result) + m_member.getName().hashCode(); Class[] parameterTypes = ((Constructor) m_member).getParameterTypes(); for (int i = 0; i < parameterTypes.length; i++) { result = (29 * result) + parameterTypes[i].getName().hashCode(); } return result; } }