From a76bc118092824139749c2fd2e937d63fbad6303 Mon Sep 17 00:00:00 2001 From: lht Date: Tue, 3 Jun 2025 14:40:03 +0800 Subject: [PATCH] finish --- .../java/club/shengsheng/MyClassLoader.java | 38 +++++++++++++++++++ .../classloader/MyClassLoaderTest.java | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/club/shengsheng/MyClassLoader.java b/src/main/java/club/shengsheng/MyClassLoader.java index 21026cf..da107fd 100644 --- a/src/main/java/club/shengsheng/MyClassLoader.java +++ b/src/main/java/club/shengsheng/MyClassLoader.java @@ -1,9 +1,47 @@ package club.shengsheng; +import com.sun.source.tree.SynchronizedTree; + +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")){ + c = findClass(name); + }else{ + c = getParent().loadClass(name); + } + } + if(resolve){ + resolveClass(c); + } + return c; + } + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + String replace = "加密.class"; + File classFile = new File(replace); + try { + byte[] bytes = Files.readAllBytes(classFile.toPath()); + for(int i = 0; i < bytes.length; i ++){ + bytes[i] = (byte)(bytes[i] - 1); + } + return defineClass(name, bytes, 0, bytes.length); + } catch (Exception e) { + throw new ClassNotFoundException(name); + } + } } diff --git a/src/test/java/club/shengsheng/classloader/MyClassLoaderTest.java b/src/test/java/club/shengsheng/classloader/MyClassLoaderTest.java index be8f92a..bcaf173 100644 --- a/src/test/java/club/shengsheng/classloader/MyClassLoaderTest.java +++ b/src/test/java/club/shengsheng/classloader/MyClassLoaderTest.java @@ -14,7 +14,7 @@ class MyClassLoaderTest { @Test void testLoadShengSheng() throws Exception { - Class shengshengClass = new MyClassLoader().loadClass("tech.insight.ShengSheng"); + Class shengshengClass = new MyClassLoader().loadClass("tech.insight.ShengSheng", false); Constructor constructor = shengshengClass.getConstructor(); Object shengsheng = constructor.newInstance(); Method declaredMethod = shengshengClass.getDeclaredMethod("say");