Browse Source

154427: test and fix

tags/V1_6_3rc1
aclement 15 years ago
parent
commit
7c00631cac
1 changed files with 81 additions and 37 deletions
  1. 81
    37
      runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java

+ 81
- 37
runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java View File

@@ -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;
}
}

Loading…
Cancel
Save