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.asm; 9 10 import org.codehaus.aspectwerkz.annotation.instrumentation.asm.CustomAttribute; 11 import org.codehaus.aspectwerkz.annotation.instrumentation.asm.CustomAttributeHelper; 12 import org.codehaus.aspectwerkz.annotation.AnnotationInfo; 13 import org.codehaus.aspectwerkz.reflect.ClassInfo; 14 import org.codehaus.aspectwerkz.reflect.MemberInfo; 15 import org.codehaus.aspectwerkz.UnbrokenObjectInputStream; 16 import org.objectweb.asm.Attribute; 17 import org.objectweb.asm.attrs.RuntimeInvisibleAnnotations; 18 import org.objectweb.asm.attrs.Annotation; 19 import org.objectweb.asm.attrs.RuntimeVisibleAnnotations; 20 21 import java.io.ByteArrayInputStream; 22 import java.lang.ref.WeakReference; 23 import java.util.*; 24 25 /*** 26 * ASM implementation of the MemberInfo interface. 27 * 28 * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér </a> 29 */ 30 public abstract class AsmMemberInfo implements MemberInfo { 31 32 /*** 33 * The member. 34 */ 35 protected final MemberStruct m_member; 36 37 /*** 38 * The class loader wrapped in a weak ref. 39 */ 40 protected final WeakReference m_loaderRef; 41 42 /*** 43 * The declaring type name. 44 */ 45 protected final String m_declaringTypeName; 46 47 /*** 48 * The declaring type. 49 */ 50 protected ClassInfo m_declaringType; 51 52 /*** 53 * The annotations. 54 */ 55 protected List m_annotations = null; 56 57 /*** 58 * The class info repository. 59 */ 60 protected final AsmClassInfoRepository m_classInfoRepository; 61 62 /*** 63 * Creates a new member meta data instance. 64 * 65 * @param member 66 * @param declaringType 67 * @param loader 68 */ 69 AsmMemberInfo(final MemberStruct member, final String declaringType, final ClassLoader loader) { 70 if (member == null) { 71 throw new IllegalArgumentException("member can not be null"); 72 } 73 if (declaringType == null) { 74 throw new IllegalArgumentException("declaring type can not be null"); 75 } 76 m_member = member; 77 m_loaderRef = new WeakReference(loader); 78 m_declaringTypeName = declaringType.replace('/', '.'); 79 m_classInfoRepository = AsmClassInfoRepository.getRepository(loader); 80 } 81 82 /*** 83 * Returns the name. 84 * 85 * @return the name 86 */ 87 public String getName() { 88 return m_member.name; 89 } 90 91 /*** 92 * Returns the modifiers. 93 * 94 * @return the modifiers 95 */ 96 public int getModifiers() { 97 return m_member.modifiers; 98 } 99 100 /*** 101 * Returns the declaring type. 102 * 103 * @return the declaring type 104 */ 105 public ClassInfo getDeclaringType() { 106 if (m_declaringType == null) { 107 m_declaringType = m_classInfoRepository.getClassInfo(m_declaringTypeName); 108 } 109 return m_declaringType; 110 } 111 112 /*** 113 * Retrieves and adds the annotations. 114 * 115 * @param attrs 116 */ 117 private void addAnnotations(final Attribute attrs) { 118 Attribute attributes = attrs; 119 while (attributes != null) { 120 if (attributes instanceof RuntimeInvisibleAnnotations) { 121 for (Iterator it = ((RuntimeInvisibleAnnotations)attributes).annotations.iterator(); it.hasNext();) { 122 Annotation annotation = (Annotation)it.next(); 123 if (CustomAttribute.TYPE.equals(annotation.type)) { 124 m_annotations.add(CustomAttributeHelper.extractCustomAnnotation(annotation)); 125 } else { 126 AnnotationInfo annotationInfo = AsmClassInfo.getAnnotationInfo( 127 annotation, 128 (ClassLoader)m_loaderRef.get() 129 ); 130 m_annotations.add(annotationInfo); 131 } 132 } 133 } 134 if (attributes instanceof RuntimeVisibleAnnotations) { 135 for (Iterator it = ((RuntimeVisibleAnnotations)attributes).annotations.iterator(); it.hasNext();) { 136 Annotation annotation = (Annotation)it.next(); 137 AnnotationInfo annotationInfo = AsmClassInfo.getAnnotationInfo( 138 annotation, 139 (ClassLoader)m_loaderRef.get() 140 ); 141 m_annotations.add(annotationInfo); 142 } 143 } 144 attributes = attributes.next; 145 } 146 } 147 }