From 2edd1780cd94be18894d5adea37ca8d75fc7a2da Mon Sep 17 00:00:00 2001 From: XianReallyHot-ZZH <741788769@qq.com> Date: Mon, 2 Jun 2025 20:44:48 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=B1=BB=E5=8A=A0=E8=BD=BD=E5=99=A8=E7=9A=84=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/club/shengsheng/MyClassLoader.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/main/java/club/shengsheng/MyClassLoader.java b/src/main/java/club/shengsheng/MyClassLoader.java index 21026cf..e2f49d1 100644 --- a/src/main/java/club/shengsheng/MyClassLoader.java +++ b/src/main/java/club/shengsheng/MyClassLoader.java @@ -1,9 +1,73 @@ package club.shengsheng; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + /** * @author gongxuanzhangmelt@gmail.com **/ public class MyClassLoader extends ClassLoader { + /** + * 重写findClass方法,让其查找我们指定路径下的class文件,并完成定义加载 + * + * @param name + * @return + * @throws ClassNotFoundException + */ + @Override + protected Class findClass(String name) throws ClassNotFoundException { + // 1、读取项目根目录中的加密.class文件,获取class文件的字节数组 + String filePath = "D:\\Developer\\Github\\shengshengjava\\custom-classloader\\加密.class"; + byte[] classBytes = readClassFile(filePath); + + if (classBytes == null) { + throw new ClassNotFoundException("无法加载类:" + name); + } + + // 2、解密字节数组,并返回解密后的字节数组。解密规则:每个字节减1 + classBytes = decryptClassBytes(classBytes); + + return defineClass(name, classBytes, 0, classBytes.length); + } + + private byte[] decryptClassBytes(byte[] classBytes) { + for (int i = 0; i < classBytes.length; i++) { + classBytes[i] = (byte) (classBytes[i] - 1); + } + return classBytes; + } + + /** + * 读取class文件到字节数组 + * + * @param filePath class文件路径 + * @return 字节数组 或 null + */ + private byte[] readClassFile(String filePath) { + File file = new File(filePath); + if (!file.exists()) { + System.err.println("文件不存在: " + filePath); + return null; + } + + try (FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + baos.write(buffer, 0, bytesRead); + } + return baos.toByteArray(); + + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + } From b59d82c4fa74ee1800b0d884bff4caac22a8349f Mon Sep 17 00:00:00 2001 From: XianReallyHot-ZZH <741788769@qq.com> Date: Mon, 2 Jun 2025 20:58:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/club/shengsheng/MyClassLoader.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/club/shengsheng/MyClassLoader.java b/src/main/java/club/shengsheng/MyClassLoader.java index e2f49d1..5abee0a 100644 --- a/src/main/java/club/shengsheng/MyClassLoader.java +++ b/src/main/java/club/shengsheng/MyClassLoader.java @@ -21,7 +21,8 @@ public class MyClassLoader extends ClassLoader { @Override protected Class findClass(String name) throws ClassNotFoundException { // 1、读取项目根目录中的加密.class文件,获取class文件的字节数组 - String filePath = "D:\\Developer\\Github\\shengshengjava\\custom-classloader\\加密.class"; + String projectDir = System.getProperty("user.dir"); // 获取项目根目录 + String filePath = projectDir + File.separator + "加密.class"; byte[] classBytes = readClassFile(filePath); if (classBytes == null) {