Browse Source

paramannos: aware of parameter annotation matching

tags/V1_6_0M2
aclement 16 years ago
parent
commit
7026369f60

+ 60
- 1
weaver5/java5-src/org/aspectj/weaver/reflect/Java15AnnotationFinder.java View File

@@ -26,7 +26,6 @@ import org.aspectj.apache.bcel.classfile.LocalVariable;
import org.aspectj.apache.bcel.classfile.LocalVariableTable;
import org.aspectj.apache.bcel.util.NonCachingClassLoaderRepository;
import org.aspectj.apache.bcel.util.Repository;
import org.aspectj.apache.bcel.util.ClassLoaderRepository;
import org.aspectj.weaver.ResolvedType;
import org.aspectj.weaver.UnresolvedType;
import org.aspectj.weaver.World;
@@ -201,4 +200,64 @@ public class Java15AnnotationFinder implements AnnotationFinder, ArgNameFinder {
}
return ret;
}
public static final ResolvedType[][] NO_PARAMETER_ANNOTATIONS = new ResolvedType[][]{};
public ResolvedType[][] getParameterAnnotationTypes(Member onMember) {
if (!(onMember instanceof AccessibleObject)) return NO_PARAMETER_ANNOTATIONS;
// here we really want both the runtime visible AND the class visible annotations
// so we bail out to Bcel and then chuck away the JavaClass so that we don't hog
// memory.
try {
JavaClass jc = bcelRepository.loadClass(onMember.getDeclaringClass());
org.aspectj.apache.bcel.classfile.annotation.Annotation[][] anns = null;
if (onMember instanceof Method) {
org.aspectj.apache.bcel.classfile.Method bcelMethod = jc.getMethod((Method)onMember);
anns = bcelMethod.getParameterAnnotations();
} else if (onMember instanceof Constructor) {
org.aspectj.apache.bcel.classfile.Method bcelCons = jc.getMethod((Constructor)onMember);
anns = bcelCons.getParameterAnnotations();
} else if (onMember instanceof Field) {
anns = null;
}
// the answer is cached and we don't want to hold on to memory
bcelRepository.clear();
if (anns == null) return NO_PARAMETER_ANNOTATIONS;
ResolvedType[][] result = new ResolvedType[anns.length][];
// CACHING??
for (int i=0;i<anns.length;i++) {
if (anns[i]!=null) {
result[i] = new ResolvedType[anns[i].length];
for (int j=0;j<anns[i].length;j++) {
result[i][j] = world.resolve(UnresolvedType.forSignature(anns[i][j].getTypeSignature()));
}
}
}
return result;
} catch (ClassNotFoundException cnfEx) {
// just use reflection then
}
// reflection...
AccessibleObject ao = (AccessibleObject) onMember;
Annotation[][] anns = null;
if (onMember instanceof Method) {
anns = ((Method)ao).getParameterAnnotations();
} else if (onMember instanceof Constructor) {
anns = ((Constructor)ao).getParameterAnnotations();
} else if (onMember instanceof Field) {
anns = null;
}
if (anns == null) return NO_PARAMETER_ANNOTATIONS;
ResolvedType[][] result = new ResolvedType[anns.length][];
// CACHING??
for (int i=0;i<anns.length;i++) {
if (anns[i]!=null) {
result[i] = new ResolvedType[anns[i].length];
for (int j=0;j<anns[i].length;j++) {
result[i][j] = UnresolvedType.forName(anns[i][j].annotationType().getName()).resolve(world);
}
}
}
return result;
}
}

Loading…
Cancel
Save