diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib$ProxyInvocationHandler.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib$ProxyInvocationHandler.class index b12e9b9f..b39297b7 100644 Binary files a/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib$ProxyInvocationHandler.class and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib$ProxyInvocationHandler.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.class index c0c7949a..07de9492 100644 Binary files a/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.class and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.java b/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.java index b59ddc98..96803116 100644 --- a/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.java +++ b/jse/src/main/java/org/luaj/vm2/libs/jse/LuajavaLib.java @@ -242,7 +242,26 @@ public class LuajavaLib extends VarArgFunction { // load classes using app loader to allow luaj to be used as an extension protected Class classForName(String name) throws ClassNotFoundException { - Class clazz = Class.forName(name, true, ClassLoader.getSystemClassLoader()); + Class clazz = null; + ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); + if (contextLoader != null) { + try { + clazz = Class.forName(name, true, contextLoader); + } catch (ClassNotFoundException ignored) { + } + } + if (clazz == null) { + ClassLoader libraryLoader = getClass().getClassLoader(); + if (libraryLoader != null) { + try { + clazz = Class.forName(name, true, libraryLoader); + } catch (ClassNotFoundException ignored) { + } + } + } + if (clazz == null) { + clazz = Class.forName(name, true, ClassLoader.getSystemClassLoader()); + } if (!isClassVisible(clazz)) throw new ClassNotFoundException("class is not visible: " + name); return clazz; diff --git a/jse/src/test/java/org/luaj/vm2/libs/jse/LuajavaLibClassLoaderTest.java b/jse/src/test/java/org/luaj/vm2/libs/jse/LuajavaLibClassLoaderTest.java new file mode 100644 index 00000000..0634379e --- /dev/null +++ b/jse/src/test/java/org/luaj/vm2/libs/jse/LuajavaLibClassLoaderTest.java @@ -0,0 +1,36 @@ +package org.luaj.vm2.libs.jse; + +import junit.framework.TestCase; + +public class LuajavaLibClassLoaderTest extends TestCase { + + public void testClassForNameFallsBackToLibraryLoader() throws Exception { + ExposedLuajavaLib lib = new ExposedLuajavaLib(); + ClassLoader previous = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(new RejectingClassLoader()); + try { + Class clazz = lib.exposedClassForName(LocalVisibleClass.class.getName()); + assertEquals(LocalVisibleClass.class, clazz); + } finally { + Thread.currentThread().setContextClassLoader(previous); + } + } + + static final class ExposedLuajavaLib extends LuajavaLib { + Class exposedClassForName(String name) throws ClassNotFoundException { + return classForName(name); + } + } + + static final class RejectingClassLoader extends ClassLoader { + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + if (LocalVisibleClass.class.getName().equals(name)) { + throw new ClassNotFoundException(name); + } + return super.loadClass(name, resolve); + } + } + + public static final class LocalVisibleClass { + } +}