refactor(classloader): 重构类加载器并优化黑名单处理

- 使用 CopyOnWriteArrayList 替代 ArrayList 以提高线程安全- 优化类加载逻辑,避免类重复加载
- 黑名单添加更多系统和第三方库前缀
- 修复类循环依赖问题
- 简化代码结构,提高可读性
This commit is contained in:
tzdwindows 7
2025-02-11 16:30:06 +08:00
parent 4d08fbeab0
commit e027bbe791
2 changed files with 59 additions and 70 deletions

View File

@@ -26,6 +26,7 @@ public class Main {
private static final String[] AUTHOR = new String[]{ private static final String[] AUTHOR = new String[]{
"tzdwindows 7" "tzdwindows 7"
}; };
/** 我是总任务数 **/ /** 我是总任务数 **/
public int totalTasks = 1; public int totalTasks = 1;
/** 我是当前任务数 **/ /** 我是当前任务数 **/

View File

@@ -1,30 +1,39 @@
package com.axis.innovators.box.plugins; package com.axis.innovators.box.plugins;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Collections;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 自定义类加载器装载CorePlugins
* @author tzdwindows 7
*/
public class BoxClassLoader extends URLClassLoader { public class BoxClassLoader extends URLClassLoader {
private static final List<IClassTransformer> CLASS_TRANSFORMS = new ArrayList<>(); private static final List<IClassTransformer> CLASS_TRANSFORMS = new CopyOnWriteArrayList<>();
private static final List<String> CLASS_BLACKLIST = new ArrayList<>(); private static final List<String> CLASS_BLACKLIST = new ArrayList<>();
private static final List<String> CLASS_LOADING_LIST = new ArrayList<>(); private static final List<String> CLASS_LOADING_LIST = Collections.synchronizedList(new ArrayList<>());
private static final List<Class<?>> CLASS_LOADING_LIST_OBJECT = new ArrayList<>(); private static final List<Class<?>> CLASS_LOADING_LIST_OBJECT = new CopyOnWriteArrayList<>();
static { static {
// 添加黑名单,避免加载核心类 Collections.addAll(CLASS_BLACKLIST,
CLASS_BLACKLIST.add("java."); "java.", "javax.", "sun.", "com.sun.", "jdk.",
CLASS_BLACKLIST.add("javax."); "org.xml.", "org.w3c.", "org.apache.",
CLASS_BLACKLIST.add("sun."); "javax.management.", "javax.swing."
);
} }
public BoxClassLoader(ClassLoader parent) { public BoxClassLoader(ClassLoader parent) {
super(new URL[]{}, parent); super(new URL[]{}, parent);
try {
PluginLoader.loadCorePlugin();
} catch (IOException e) {
throw new RuntimeException("Failed to load core plugin", e);
}
} }
public BoxClassLoader(URL[] urls, ClassLoader parent) { public BoxClassLoader(URL[] urls, ClassLoader parent) {
@@ -36,77 +45,56 @@ public class BoxClassLoader extends URLClassLoader {
super.addURL(url); super.addURL(url);
} }
//@Override @Override
//protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
// synchronized (getClassLoadingLock(name)) { synchronized (getClassLoadingLock(name)) {
// // 1. 检查类是否已加载 Class<?> loadedClass = findLoadedClass(name);
// Class<?> c = findLoadedClass(name); if (loadedClass != null) return loadedClass;
// if (c != null) {
// return c; if (isBlacklisted(name)) {
// } return getParent().loadClass(name);
// }
// // 2. 检查黑名单
// if (isBlacklisted(name)) { try {
// return super.loadClass(name, resolve); Class<?> c = findClass(name);
// } if (resolve) resolveClass(c);
// return c;
// // 3. 尝试自定义加载 } catch (ClassNotFoundException e) {
// try { return super.loadClass(name, resolve);
// c = findClass(name); }
// } catch (ClassNotFoundException e) { }
// // 4. 自定义加载失败则委托给父加载器 }
// c = super.loadClass(name, resolve);
// }
//
// if (resolve) {
// resolveClass(c);
// }
// return c;
// }
//}
@Override @Override
protected Class<?> findClass(String name) throws ClassNotFoundException { protected Class<?> findClass(String name) throws ClassNotFoundException {
// 检查是否在黑名单中 synchronized (getClassLoadingLock(name)) {
if (isBlacklisted(name)) { if (CLASS_LOADING_LIST.contains(name)) {
throw new ClassNotFoundException("Class is blacklisted: " + name); throw new ClassCircularityError(name + " circular loading detected");
} }
// 检查是否正在加载 CLASS_LOADING_LIST.add(name);
if (CLASS_LOADING_LIST.contains(name)) { try {
throw new ClassNotFoundException("Class is already loading: " + name); byte[] clazzByte = getClassBytes(name);
} for (IClassTransformer transformer : CLASS_TRANSFORMS) {
byte[] transformed = transformer.transform(name, transformer.getClass().getName(), clazzByte);
if (transformed != null) clazzByte = transformed;
}
// 读取类字节码 Class<?> clazz = defineClass(name, clazzByte, 0, clazzByte.length);
byte[] clazzByte; CLASS_LOADING_LIST_OBJECT.add(clazz);
try { return clazz;
clazzByte = getClassBytes(name); } catch (IOException e) {
} catch (IOException e) { throw new ClassNotFoundException("Class byte loading failed", e);
throw new ClassNotFoundException("Failed to load class bytes: " + name, e); } finally {
} CLASS_LOADING_LIST.remove(name);
// 应用类转换器
for (IClassTransformer transformer : CLASS_TRANSFORMS) {
byte[] transformed = transformer.transform(name, transformer.getClass().getName(), clazzByte);
if (transformed != null) {
clazzByte = transformed;
} }
} }
// 定义类
CLASS_LOADING_LIST.add(name);
Class<?> clazz = defineClass(name, clazzByte, 0, clazzByte.length);
CLASS_LOADING_LIST_OBJECT.add(clazz);
return clazz;
} }
private byte[] getClassBytes(String className) throws IOException, ClassNotFoundException { private byte[] getClassBytes(String className) throws IOException, ClassNotFoundException {
String path = className.replace('.', '/') + ".class"; String path = className.replace('.', '/') + ".class";
URL classUrl = getResource(path); try (InputStream is = getResourceAsStream(path)) {
if (classUrl == null) { if (is == null) throw new ClassNotFoundException(className);
throw new ClassNotFoundException("Class not found: " + className);
}
try (InputStream is = classUrl.openStream()) {
return is.readAllBytes(); return is.readAllBytes();
} }
} }