re PR libgcj/7060 (getMethod() doesn't search super interface)
2002-07-04 Tom Tromey <tromey@redhat.com> Jeff Sturm <jsturm@one-point.com> Fix for PR libgcj/7060: * java/lang/Class.h (_getMethod): Renamed from getMethod. * java/lang/natClass.cc (_getMethod): Renamed from getMethod. Recurse into superinterfaces. Don't throw NoSuchMethodException. * java/lang/Class.java (getMethod): New Java implementation; complies with spec. (_getMethod): New native method. Co-Authored-By: Jeff Sturm <jsturm@one-point.com> From-SVN: r55266
This commit is contained in:
parent
9833f6792a
commit
0d49ec1158
4 changed files with 51 additions and 5 deletions
|
@ -1,3 +1,14 @@
|
|||
2002-07-04 Tom Tromey <tromey@redhat.com>
|
||||
Jeff Sturm <jsturm@one-point.com>
|
||||
|
||||
Fix for PR libgcj/7060:
|
||||
* java/lang/Class.h (_getMethod): Renamed from getMethod.
|
||||
* java/lang/natClass.cc (_getMethod): Renamed from getMethod.
|
||||
Recurse into superinterfaces. Don't throw NoSuchMethodException.
|
||||
* java/lang/Class.java (getMethod): New Java implementation;
|
||||
complies with spec.
|
||||
(_getMethod): New native method.
|
||||
|
||||
2002-07-02 Tom Tromey <tromey@redhat.com>
|
||||
David Hovemeyer <daveho@cs.umd.edu>
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@ public:
|
|||
|
||||
void getSignature (java::lang::StringBuffer *buffer);
|
||||
static jstring getSignature (JArray<jclass> *, jboolean is_constructor);
|
||||
java::lang::reflect::Method *getMethod (jstring, JArray<jclass> *);
|
||||
java::lang::reflect::Method *_getMethod (jstring, JArray<jclass> *);
|
||||
JArray<java::lang::reflect::Method *> *getMethods (void);
|
||||
|
||||
inline jint getModifiers (void)
|
||||
|
|
|
@ -121,8 +121,29 @@ public final class Class implements Serializable
|
|||
private static final native String getSignature (Class[] parameterTypes,
|
||||
boolean is_construtor);
|
||||
|
||||
public native Method getMethod (String methodName, Class[] parameterTypes)
|
||||
throws NoSuchMethodException, SecurityException;
|
||||
public native Method _getMethod (String methodName, Class[] parameterTypes);
|
||||
|
||||
public Method getMethod (String methodName, Class[] parameterTypes)
|
||||
throws NoSuchMethodException, SecurityException
|
||||
{
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null)
|
||||
{
|
||||
sm.checkMemberAccess(this, Member.PUBLIC);
|
||||
Package p = getPackage();
|
||||
if (p != null)
|
||||
sm.checkPackageAccess(p.getName());
|
||||
}
|
||||
|
||||
if ("<init>".equals(methodName) || "<clinit>".equals(methodName))
|
||||
throw new NoSuchMethodException(methodName);
|
||||
|
||||
Method m = _getMethod(methodName, parameterTypes);
|
||||
if (m == null)
|
||||
throw new NoSuchMethodException (methodName);
|
||||
return m;
|
||||
}
|
||||
|
||||
private native int _getMethods (Method[] result, int offset);
|
||||
public native Method[] getMethods () throws SecurityException;
|
||||
|
||||
|
|
|
@ -485,7 +485,7 @@ java::lang::Class::getInterfaces (void)
|
|||
}
|
||||
|
||||
java::lang::reflect::Method *
|
||||
java::lang::Class::getMethod (jstring name, JArray<jclass> *param_types)
|
||||
java::lang::Class::_getMethod (jstring name, JArray<jclass> *param_types)
|
||||
{
|
||||
jstring partial_sig = getSignature (param_types, false);
|
||||
jint p_len = partial_sig->length();
|
||||
|
@ -514,7 +514,21 @@ java::lang::Class::getMethod (jstring name, JArray<jclass> *param_types)
|
|||
}
|
||||
}
|
||||
}
|
||||
throw new java::lang::NoSuchMethodException;
|
||||
|
||||
// If we haven't found a match, and this class is an interface, then
|
||||
// check all the superinterfaces.
|
||||
if (isInterface())
|
||||
{
|
||||
for (int i = 0; i < interface_count; ++i)
|
||||
{
|
||||
using namespace java::lang::reflect;
|
||||
Method *rmethod = interfaces[i]->_getMethod (name, param_types);
|
||||
if (rmethod != NULL)
|
||||
return rmethod;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// This is a very slow implementation, since it re-scans all the
|
||||
|
|
Loading…
Add table
Reference in a new issue