Skip to content

Improvement: autoclass() when class not in boot classpath #534

@cmacdonald

Description

@cmacdonald

I have a slight problem: I'm trying to instantiate a class that is have a java.lang.Class reference to. This was provided by a ClassLoader accessing a classpath different from "boot time". Traceback attached below.

However, JNI's FindClass() only provides jclass for classes in the boot classpath, i.e. using ClassLoader.getSystemClassLoader().

I dont think we need FindClass(), as we already have access to the Class object. We just need to instantiate it from that Class object.

  1. A possible workaround is adding an optional parameter to autoclass() providing the Class object directly, i.e.
other_class = bla._class.getClassLoader().loadClass("my.other.Class")
other_classInstance = autoclass(None, cls=other_class)()
  1. Or being able to pass a ClassLoader to autoclass? Dont think this would work in the generic case.

  2. Or detecting when a Class object is being instantiated into Python, add that to jclass_register

Traceback.

Traceback (most recent call last):
  File "tests/test_rewrite.py", line 97, in test_rm3
    qe = pt.rewrite.RM3(indexref)
  File "/Users/craigm/git/Pyterrier/pyterrier/rewrite.py", line 139, in __init__
    rm = pt.ApplicationSetup.getClass("org.terrier.querying.RM3").newInstance()
  File "jnius/jnius_export_class.pxi", line 857, in jnius.JavaMethod.__call__
  File "jnius/jnius_export_class.pxi", line 939, in jnius.JavaMethod.call_method
  File "jnius/jnius_conversion.pxi", line 212, in jnius.convert_jobject_to_python
  File "/Users/craigm/anaconda3/envs/pyterrier/lib/python3.6/site-packages/jnius/reflect.py", line 229, in autoclass
    c = find_javaclass(clsname)
  File "jnius/jnius_export_func.pxi", line 26, in jnius.find_javaclass
  File "jnius/jnius_jvm_dlopen.pxi", line 91, in jnius.create_jnienv
jnius.JavaException: JVM exception occurred: org/terrier/querying/RM3 java.lang.NoClassDefFoundError

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions