From 921606b93f24e0152ef6535c558aa4ddd36eb431 Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Mon, 2 Mar 2026 14:48:30 +0100 Subject: [PATCH] Implemented issue: #65 --- .../LuajavaLib$ProxyInvocationHandler.class | Bin 1892 -> 1892 bytes .../org/luaj/vm2/libs/jse/LuajavaLib.class | Bin 5820 -> 6100 bytes .../org/luaj/vm2/libs/jse/LuajavaLib.java | 21 +++++++++- .../libs/jse/LuajavaLibClassLoaderTest.java | 36 ++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 jse/src/test/java/org/luaj/vm2/libs/jse/LuajavaLibClassLoaderTest.java 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 b12e9b9f787e1c8c24244f43758e631b33112d6a..b39297b77145ffd59cb1da9d10bffab447741837 100644 GIT binary patch delta 116 zcmaFD_k?dl7b_Q|AOj1d5CbQp@Z>41-y_8s*cinb1Q{h5BpD?cq#30cbQz@?EE#1P z>=@-3+!^H={1_D&A{Z4Jk{Fd3@_=*+qcTGsqYA?WAU%yym0>2M8p8rcb%s@p8VuWj R^d3enh7*k1lb^6P001)T6V(6! delta 116 zcmWN?F%rQ*0EW@;AK8@zDeRFjkSeuNtIQ;m8J$|CQaONw>>YI2*F5jM zdz?+mmxv#Us2lUycd&}cWthvdP?x1*R!Ui`$3}g&8nBb&pdn?rQpQm^mvE~QSB<%; Q;I0YJ@JmzPn$_N({+WUku8?zhKnFlkkBFCVuFTAHXDS0bgGTCO&u!f?D72_Y>@3JFZ(GP9U6*bF%hc>+F5^ zS@+fcQv=r9i-%qZFe1zMTO;2f+G&rvLhH98H@QD&<)tWg3Onfc~Z+xUMzI2O;F9mkNed69i*~=HkToYdl0t}e= zmYFej>$&%pircoE_`W*nJS3WkIvOcTSPiwb_t=7Dq3CsPcfHQ?mZ_;?$#chtJ0%*D zh$Sr&H6-TXafz!PEe&Z^JEFaMo1jBI8SPNVqAM#u;1&peR7Fz&zLdPzIaRL95 zG_PKWbyxgs3j*Aq=J^cbcoqvp1~l_-1FfVlqT$mSZ0G4O{Qx5ScnW+uYjJ-LCem1b ziP^=1e$*nf_aIUlUb%w5oBSJ4>9{25W)FUkwlByW#Pxxz6nm(+30>C^+<3KMF9j>G z@*09}U!dNM>#6@g;zcTY(CaJI*?4)KxiIl?AmbHLMBLSZbug z5eY5EfdCK6x>+2Z#=GnLk06@S`)6@{-OC6L>wRybqjwrZ(|CSZPwPhz%ka3I4l?az z2tV*6eY4oO2l2zGwKLBPJEFAX&}Q!2PJ^jw8@Z!aEBQDt-}}<3me2Cj^_rOPLB&b%>MXo%9GtRfEYIzCV2T+|QW5Zas{-+zdXg!Z-k9nl@ORU* pbL`T$wI&W<#9Z1fNif#M9$MMeb)hhsrX=auImWppCCem@^nX#y0S*8F delta 906 zcmZWmNlX(_82ckmqvBR~1w}zc@SnlpMBd@O_x<1Z@7d)SmIkg&_6-1NAfr3b z5R`SHI?;mbA>6=Cc|N$FZb>y%?ayGZhC75RIiywAM*_$~6}V6EH|>mXuixF6NC-S6 z1mm&&>*9&_#&~l~V344)LEs59&26#9_SnX@)&mCxhEkc(R#Gr7BYG=Ap3=)nkpp_E z?g@~Wd>UyX>>(j@`V{5KTz;7HrBSdp`3%cIc+M3oc!6TPbm3Qwb1wXv@f#O@%lMrO zzi0fxg+DT0h1DFp7@u7B&j@l(FMOZ~hMBHpNc?)kX;3$R2qSz4xF+BbJm`QQU+|Uf z!%`Rvx7e%>mG2|`9)*Ep7-ghE5o;lrbeW})NUU4RC@=U=a^7D`iFve|;JM$Bu2~=ok!4Kv=oH@f~{&YrSXWHcW z0g--Wtu*eYlF)jfrI05sB5kSWy{P3eA4Dy$`6z1n%*RnnGoMCNSov?O(|g;-+ug^x zlN|AvQ`ZE3^DDTMPF`RZlZn+a 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 { + } +}