From 076236f6805d9f4f9cf302d596fb17798588820f Mon Sep 17 00:00:00 2001 From: xiatian Date: Thu, 19 Jun 2025 00:00:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=B1=BB=E5=8A=A0=E8=BD=BD=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重写 loadClass 和 findClass 方法 - 添加解密字节码的功能 -支持加载特定包名的类 - 处理类加载锁和父类加载器的逻辑 --- .../java/club/shengsheng/MyClassLoader.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/main/java/club/shengsheng/MyClassLoader.java b/src/main/java/club/shengsheng/MyClassLoader.java index 21026cf..8851d40 100644 --- a/src/main/java/club/shengsheng/MyClassLoader.java +++ b/src/main/java/club/shengsheng/MyClassLoader.java @@ -1,9 +1,57 @@ package club.shengsheng; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + /** * @author gongxuanzhangmelt@gmail.com **/ public class MyClassLoader extends ClassLoader { + @Override + public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + synchronized (getClassLoadingLock(name)) { + Class c = findLoadedClass(name); + if (c == null) { + if (name.startsWith("tech.insight")) { + c = findClass(name); + } else { + c = this.getParent().loadClass(name); + } + } + if (resolve) { + resolveClass(c); + } + return c; + } + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("win"); + String relativePath; + if (name.equals("tech.insight.ShengSheng")) { + relativePath = "加密.class"; + } else { + relativePath = name.replaceAll("\\.", isWindows ? "\\".concat(File.separator) : File.separator).concat(".class"); + } + File classFile = new File(relativePath); + byte[] bytes; + try { + bytes = decodeBytes(Files.readAllBytes(classFile.toPath())); + } catch (IOException e) { + throw new RuntimeException(e); + } + return defineClass(name, bytes, 0, bytes.length); + } + + private byte[] decodeBytes(byte[] bytes) { + byte[] decodedBytes = new byte[bytes.length]; + for (int i = 0; i < bytes.length; i++) { + decodedBytes[i] = (byte) (bytes[i] - 1); + } + return decodedBytes; + } }