From 7c00631cac0293e407812d68e7dd2d170ef34e7f Mon Sep 17 00:00:00 2001 From: aclement Date: Mon, 1 Dec 2008 19:03:25 +0000 Subject: [PATCH] 154427: test and fix --- .../runtime/reflect/MethodSignatureImpl.java | 118 ++++++++++++------ 1 file changed, 81 insertions(+), 37 deletions(-) diff --git a/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java index 2c04f4c53..17416bada 100644 --- a/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java @@ -11,60 +11,104 @@ * Xerox/PARC initial implementation * ******************************************************************/ - package org.aspectj.runtime.reflect; import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; import org.aspectj.lang.reflect.MethodSignature; class MethodSignatureImpl extends CodeSignatureImpl implements MethodSignature { private Method method; - Class returnType; - - MethodSignatureImpl(int modifiers, String name, Class declaringType, - Class[] parameterTypes, String[] parameterNames, Class[] exceptionTypes, - Class returnType) - { - super(modifiers, name, declaringType, parameterTypes, parameterNames, - exceptionTypes); - this.returnType = returnType; - } - - MethodSignatureImpl(String stringRep) { - super(stringRep); - } + Class returnType; + + MethodSignatureImpl(int modifiers, String name, Class declaringType, Class[] parameterTypes, String[] parameterNames, + Class[] exceptionTypes, Class returnType) { + super(modifiers, name, declaringType, parameterTypes, parameterNames, exceptionTypes); + this.returnType = returnType; + } + + MethodSignatureImpl(String stringRep) { + super(stringRep); + } - /* name is consistent with reflection API */ - public Class getReturnType() { - if (returnType == null) returnType = extractType(6); - return returnType; - } - - protected String createToString(StringMaker sm) { - StringBuffer buf = new StringBuffer(); - buf.append(sm.makeModifiersString(getModifiers())); - if (sm.includeArgs) buf.append(sm.makeTypeName(getReturnType())); - if (sm.includeArgs) buf.append(" "); - buf.append(sm.makePrimaryTypeName(getDeclaringType(),getDeclaringTypeName())); - buf.append("."); - buf.append(getName()); - sm.addSignature(buf, getParameterTypes()); - sm.addThrows(buf, getExceptionTypes()); - return buf.toString(); - } - - /* (non-Javadoc) + /* name is consistent with reflection API */ + public Class getReturnType() { + if (returnType == null) + returnType = extractType(6); + return returnType; + } + + protected String createToString(StringMaker sm) { + StringBuffer buf = new StringBuffer(); + buf.append(sm.makeModifiersString(getModifiers())); + if (sm.includeArgs) + buf.append(sm.makeTypeName(getReturnType())); + if (sm.includeArgs) + buf.append(" "); + buf.append(sm.makePrimaryTypeName(getDeclaringType(), getDeclaringTypeName())); + buf.append("."); + buf.append(getName()); + sm.addSignature(buf, getParameterTypes()); + sm.addThrows(buf, getExceptionTypes()); + return buf.toString(); + } + + /* + * (non-Javadoc) + * * @see org.aspectj.lang.reflect.MemberSignature#getAccessibleObject() */ public Method getMethod() { if (method == null) { + Class dtype = getDeclaringType(); try { - method = getDeclaringType().getDeclaredMethod(getName(),getParameterTypes()); + method = dtype.getDeclaredMethod(getName(), getParameterTypes()); } catch (NoSuchMethodException nsmEx) { - ; // nothing we can do, user will see null return + // pr154427 - search + Set searched = new HashSet(); + searched.add(dtype); // avoids another getDeclaredMethod() on dtype + method = search(dtype, getName(), getParameterTypes(), searched); } } return method; } + + /** + * Hunt for a method up the hierarchy for a specified type. + * + * @param type the type on which to look for the method + * @param name the name of the method + * @param params the parameters of the method + * @param searched a set of types already searched to avoid looking at anything twice + * @return the method if found, or null if not found + */ + private Method search(Class type, String name, Class[] params, Set searched) { + if (type == null) { + return null; + } + if (!searched.contains(type)) { + searched.add(type); + try { + return type.getDeclaredMethod(name, params); + } catch (NoSuchMethodException nsme) { + // drop through and check superclass and interfaces + } + } + Method m = search(type.getSuperclass(), name, params, searched); + if (m != null) { + return m; + } + Class[] superinterfaces = type.getInterfaces(); + if (superinterfaces != null) { + for (int i = 0; i < superinterfaces.length; i++) { + m = search(superinterfaces[i], name, params, searched); + if (m != null) { + return m; + } + } + } + return null; + } } -- 2.39.5