Merge pull request #409 from kivy/fix/method_order_inheritance

Fix method order inheritance
This commit is contained in:
Peter Badida 2019-02-20 22:00:43 +01:00 committed by GitHub
commit 6553ad4409
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 48 deletions

View File

@ -44,7 +44,7 @@ class Class(with_metaclass(MetaJavaClass, JavaClass)):
getResource = JavaMethod('(Ljava/lang/String;)Ljava/net/URL;') getResource = JavaMethod('(Ljava/lang/String;)Ljava/net/URL;')
getResourceAsStream = JavaMethod('(Ljava/lang/String;)Ljava/io/InputStream;') getResourceAsStream = JavaMethod('(Ljava/lang/String;)Ljava/io/InputStream;')
getSigners = JavaMethod('()[Ljava/lang/Object;') getSigners = JavaMethod('()[Ljava/lang/Object;')
getSuperclass = JavaMethod('()Ljava/lang/reflect/Class;') getSuperclass = JavaMethod('()Ljava/lang/Class;')
isArray = JavaMethod('()Z') isArray = JavaMethod('()Z')
isAssignableFrom = JavaMethod('(Ljava/lang/reflect/Class;)Z') isAssignableFrom = JavaMethod('(Ljava/lang/reflect/Class;)Z')
isInstance = JavaMethod('(Ljava/lang/Object;)Z') isInstance = JavaMethod('(Ljava/lang/Object;)Z')
@ -168,56 +168,61 @@ def autoclass(clsname):
constructors.append((sig, constructor.isVarArgs())) constructors.append((sig, constructor.isVarArgs()))
classDict['__javaconstructor__'] = constructors classDict['__javaconstructor__'] = constructors
methods = c.getMethods() parent_class = c
methods_name = [x.getName() for x in methods] while parent_class is not None:
for index, method in enumerate(methods): methods = parent_class.getDeclaredMethods()
name = methods_name[index] methods_name = [x.getName() for x in methods]
if name in classDict:
continue
count = methods_name.count(name)
# only one method available for index, method in enumerate(methods):
if count == 1: name = methods_name[index]
static = Modifier.isStatic(method.getModifiers()) if name in classDict:
varargs = method.isVarArgs()
sig = '({0}){1}'.format(
''.join([get_signature(x) for x in method.getParameterTypes()]),
get_signature(method.getReturnType()))
cls = JavaStaticMethod if static else JavaMethod
classDict[name] = cls(sig, varargs=varargs)
if name != 'getClass' and bean_getter(name) and len(method.getParameterTypes()) == 0:
lowername = lower_name(name[2 if name.startswith('is') else 3:])
classDict[lowername] = (lambda n: property(lambda self: getattr(self, n)()))(name)
continue
# multiple signatures
signatures = []
for index, subname in enumerate(methods_name):
if subname != name:
continue continue
method = methods[index] count = methods_name.count(name)
sig = '({0}){1}'.format(
''.join([get_signature(x) for x in method.getParameterTypes()]),
get_signature(method.getReturnType()))
'''
print 'm', name, sig, method.getModifiers()
m = method.getModifiers()
print 'Public', Modifier.isPublic(m)
print 'Private', Modifier.isPrivate(m)
print 'Protected', Modifier.isProtected(m)
print 'Static', Modifier.isStatic(m)
print 'Final', Modifier.isFinal(m)
print 'Synchronized', Modifier.isSynchronized(m)
print 'Volatile', Modifier.isVolatile(m)
print 'Transient', Modifier.isTransient(m)
print 'Native', Modifier.isNative(m)
print 'Interface', Modifier.isInterface(m)
print 'Abstract', Modifier.isAbstract(m)
print 'Strict', Modifier.isStrict(m)
'''
signatures.append((sig, Modifier.isStatic(method.getModifiers()), method.isVarArgs()))
classDict[name] = JavaMultipleMethod(signatures) # only one method available
if count == 1:
static = Modifier.isStatic(method.getModifiers())
varargs = method.isVarArgs()
sig = '({0}){1}'.format(
''.join([get_signature(x) for x in method.getParameterTypes()]),
get_signature(method.getReturnType()))
cls = JavaStaticMethod if static else JavaMethod
classDict[name] = cls(sig, varargs=varargs)
if name != 'getClass' and bean_getter(name) and len(method.getParameterTypes()) == 0:
lowername = lower_name(name[2 if name.startswith('is') else 3:])
classDict[lowername] = (lambda n: property(lambda self: getattr(self, n)()))(name)
continue
# multiple signatures
signatures = []
for index, subname in enumerate(methods_name):
if subname != name:
continue
method = methods[index]
sig = '({0}){1}'.format(
''.join([get_signature(x) for x in method.getParameterTypes()]),
get_signature(method.getReturnType()))
'''
print 'm', name, sig, method.getModifiers()
m = method.getModifiers()
print 'Public', Modifier.isPublic(m)
print 'Private', Modifier.isPrivate(m)
print 'Protected', Modifier.isProtected(m)
print 'Static', Modifier.isStatic(m)
print 'Final', Modifier.isFinal(m)
print 'Synchronized', Modifier.isSynchronized(m)
print 'Volatile', Modifier.isVolatile(m)
print 'Transient', Modifier.isTransient(m)
print 'Native', Modifier.isNative(m)
print 'Interface', Modifier.isInterface(m)
print 'Abstract', Modifier.isAbstract(m)
print 'Strict', Modifier.isStrict(m)
'''
signatures.append((sig, Modifier.isStatic(method.getModifiers()), method.isVarArgs()))
classDict[name] = JavaMultipleMethod(signatures)
parent_class = parent_class.getSuperclass()
def _getitem(self, index): def _getitem(self, index):
try: try:

View File

@ -0,0 +1,9 @@
package org.jnius;
import org.jnius.Parent;
public class Child extends Parent {
static public Child newInstance(){
return new Child();
}
}

View File

@ -0,0 +1,7 @@
package org.jnius;
public class Parent {
static public Parent newInstance(){
return new Parent();
}
}

10
tests/test_inheritance.py Normal file
View File

@ -0,0 +1,10 @@
from jnius import autoclass
def test_newinstance():
Parent = autoclass('org.jnius.Parent')
Child = autoclass('org.jnius.Child')
child = Child.newInstance()
assert isinstance(child, Child)
assert isinstance(child, Parent)