diff options
Diffstat (limited to 'libjava/java/lang/natClass.cc')
-rw-r--r-- | libjava/java/lang/natClass.cc | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index a6b353f..a6955fc 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -29,6 +29,7 @@ details. */ #include <java/lang/reflect/Member.h> #include <java/lang/reflect/Method.h> #include <java/lang/reflect/Field.h> +#include <java/lang/reflect/Proxy.h> #include <java/lang/reflect/Constructor.h> #include <java/lang/AbstractMethodError.h> #include <java/lang/ArrayStoreException.h> @@ -1652,6 +1653,39 @@ _Jv_LookupDeclaredMethod (jclass klass, _Jv_Utf8Const *name, return NULL; } +// The rules for finding proxy methods are different: first we search +// the interfaces implemented by a proxy, then the methods declared in +// class Proxy. + +java::lang::reflect::Method * +_Jv_LookupProxyMethod (jclass proxyClass, _Jv_Utf8Const *name, + _Jv_Utf8Const *signature) +{ + using namespace java::lang::reflect; + jclass declaringClass; + _Jv_Method * m; + + for (int i = 0; i < proxyClass->interface_count; i++) + { + declaringClass = proxyClass->interfaces[i]; + m = _Jv_GetMethodLocal (declaringClass, name, signature); + if (m) + break; + } + if (!m) + m = _Jv_LookupDeclaredMethod (&Proxy::class$, + name, + signature, + &declaringClass); + + Method *rmethod = new Method (); + rmethod->offset = (char*) m - (char*) declaringClass->methods; + rmethod->declaringClass = declaringClass; + return rmethod; +} + + + java::lang::reflect::Method * _Jv_GetReflectedMethod (jclass klass, _Jv_Utf8Const *name, _Jv_Utf8Const *signature) |