def staticInvoke(self, className, methodName, *args): if className == "java.lang.Class" and methodName == "forName": from jnius import find_javaclass return find_javaclass(*args) from jnius import autoclass javaClass = autoclass(className) javaMember = javaClass.__dict__[methodName] return javaMember(*args)
def test_hierharchy_arraylist(self): d = identify_hierarchy_dict(find_javaclass("java.util.ArrayList"), 0, True) self.assertContains(d, "java.util.ArrayList")# concrete self.assertContains(d, "java.util.AbstractCollection")# superclass self.assertContains(d, "java.util.Collection")# interface self.assertContains(d, "java.lang.Iterable")# interface self.assertContains(d, "java.lang.Object")# root maxLevel = max(d.values()) self.assertEqual(d["java.lang.Object"], maxLevel) self.assertEqual(d["java.util.ArrayList"], 0)
def test_hierharchy_queue(self): d = identify_hierarchy_dict(find_javaclass("java.util.Queue"), 0, False) self.assertContains(d, "java.util.Queue") # super interfaces self.assertContains(d, "java.util.Collection") self.assertContains(d, "java.lang.Iterable") # all instantiated interfaces are rooted at Object self.assertContains(d, "java.lang.Object") maxLevel = max(d.values()) self.assertEqual(d["java.lang.Object"], maxLevel) self.assertEqual(d["java.util.Queue"], 0)
def jclass(data): """ Obtain a Java class object. :param data: The object from which to glean the class. Supported types include: A. Name of a class to look up, analogous to Class.forName("java.lang.String"); B. A jnius.MetaJavaClass object e.g. from jnius.autoclass, analogous to String.class; C. A jnius.JavaClass object e.g. instantiated from a jnius.MetaJavaClass, analogous to "Hello".getClass(). :returns: A java.lang.Class object, suitable for use with reflection. :raises TypeError: if the argument is not one of the aforementioned types. """ if isinstance(data, jnius.JavaClass): return data.getClass() if isinstance(data, jnius.MetaJavaClass): return jnius.find_javaclass(data.__name__) if isinstance(data, str): return jnius.find_javaclass(data) raise TypeError('Cannot glean class from data of type: ' + str(type(data)))
def autoclass(clsname): jniname = clsname.replace('.', '/') cls = MetaJavaClass.get_javaclass(jniname) if cls: return cls classDict = {} #c = Class.forName(clsname) c = find_javaclass(clsname) if c is None: raise Exception('Java class {0} not found'.format(c)) return None constructors = [] for constructor in c.getConstructors(): sig = '({0})V'.format( ''.join([get_signature(x) for x in constructor.getParameterTypes()])) constructors.append(sig) classDict['__javaconstructor__'] = constructors methods = c.getMethods() methods_name = [x.getName() for x in methods] for index, method in enumerate(methods): name = methods_name[index] if name in classDict: continue count = methods_name.count(name) # only one method available if count == 1: static = Modifier.isStatic(method.getModifiers()) 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) continue # multpile 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()))) classDict[name] = JavaMultipleMethod(signatures) for field in c.getFields(): static = Modifier.isStatic(field.getModifiers()) sig = get_signature(field.getType()) cls = JavaStaticField if static else JavaField classDict[field.getName()] = cls(sig) classDict['__javaclass__'] = clsname.replace('.', '/') return MetaJavaClass.__new__(MetaJavaClass, clsname,#.replace('.', '_'), (JavaClass, ), classDict)
def autoclass(clsname): jniname = clsname.replace('.', '/') cls = MetaJavaClass.get_javaclass(jniname) if cls: return cls clsname = str(clsname) classDict = {} #c = Class.forName(clsname) c = find_javaclass(clsname) if c is None: raise Exception('Java class {0} not found'.format(c)) return None constructors = [] for constructor in c.getConstructors(): sig = '({0})V'.format(''.join( [get_signature(x) for x in constructor.getParameterTypes()])) constructors.append((sig, constructor.isVarArgs())) classDict['__javaconstructor__'] = constructors methods = c.getMethods() methods_name = [x.getName() for x in methods] for index, method in enumerate(methods): name = methods_name[index] if name in classDict: continue count = methods_name.count(name) # 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 method = cls(sig, varargs=varargs) classDict[name] = method #if name == 'toString' and sig=='()Ljava/lang/String;': # classDict['__str__'] = method if name == 'iterator' and sig == '()Ljava/util/Iterator;': classDict['__iter__'] = iterator_wrapper(classDict[name]) continue # multpile 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) for field in c.getFields(): static = Modifier.isStatic(field.getModifiers()) sig = get_signature(field.getType()) cls = JavaStaticField if static else JavaField classDict[field.getName()] = cls(sig) classDict['__javaclass__'] = clsname.replace('.', '/') return MetaJavaClass.__new__( MetaJavaClass, clsname, # .replace('.', '_'), (JavaClass, ), classDict)