aboutsummaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authoraclement <aclement>2008-12-01 19:03:25 +0000
committeraclement <aclement>2008-12-01 19:03:25 +0000
commit7c00631cac0293e407812d68e7dd2d170ef34e7f (patch)
tree7701d25a7c67460137d4855ec81cb98da7fb83c8 /runtime
parent63420a08bd1feed9e1eefffd9dd2b5455565d665 (diff)
downloadaspectj-7c00631cac0293e407812d68e7dd2d170ef34e7f.tar.gz
aspectj-7c00631cac0293e407812d68e7dd2d170ef34e7f.zip
154427: test and fix
Diffstat (limited to 'runtime')
-rw-r--r--runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java118
1 files 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;
+ }
}