package com.ruoyi.buss.common.liquor; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * This code mainly from: Arthas project * */ public class DynamicClassLoader extends ClassLoader { private final Map byteCodes = new HashMap<>(); public DynamicClassLoader(ClassLoader classLoader) { super(classLoader != null ? classLoader : Thread.currentThread().getContextClassLoader()); } protected void registerCompiledSource(MemoryByteCode byteCode) { byteCodes.put(byteCode.getClassName(), byteCode); } protected Class defineClass(MemoryByteCode byteCode) { byteCode.defined = true; byte[] bytes = byteCode.getByteCode(); return super.defineClass(byteCode.getClassName(), bytes, 0, bytes.length); } @Override protected Class findClass(String name) throws ClassNotFoundException { MemoryByteCode byteCode = byteCodes.get(name); if (byteCode == null || byteCode.defined) { return super.findClass(name); } return defineClass(byteCode); } /** * 预处理类(完成批量定义) */ protected void prepareClasses() { for (MemoryByteCode byteCode : byteCodes.values()) { if (byteCode.defined == false) { defineClass(byteCode); } } } //================ /** * 获取类名集合 */ public Collection getClassNames() { return byteCodes.keySet(); } /** * 获取类字节码 */ public MemoryByteCode getClassBytes(String className) { return byteCodes.get(className); } /** * 获取集合大小 */ public int size() { return byteCodes.size(); } }