Implemented issue: #65

This commit is contained in:
UnlegitDqrk
2026-03-02 14:48:30 +01:00
parent 5f11997446
commit 921606b93f
4 changed files with 56 additions and 1 deletions

View File

@@ -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;

View File

@@ -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 {
}
}