java自定义ClassLoader加载指定的class文件
继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下面给出一个小demo
首先定义一个类,比如MyTest,并且将其编译成class文件,然后放到一个指定的文件夹下面,其中文件夹的最后几层就是它的包名,这里我将这个编译好的类放到 : /Users/allen/Desktop/cn/lijie/bug .class
1 2 3 4 5 6 | package cn.lijie; public class bugnew { public void shownew() { System.out.println( "shownew test!" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package com.infosec.manager.controller.login; import java.lang.reflect.Method; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class bug extends ClassLoader { public void show() { System.out.println( "show test!" ); } public void shows() { String myPath = "file:///D:/infosec/netauth/accountsync/bugnew.class" ; System.out.println(myPath); byte [] cLassBytes = null ; Path path = null ; try { path = Paths.get( new URI(myPath)); cLassBytes = Files.readAllBytes(path); Class clazz = defineClass( "cn.lijie.bugnew" , cLassBytes, 0 , cLassBytes.length); Object obj = clazz.newInstance(); Method method = clazz.getMethod( "shownew" ); method.invoke(obj); } catch (Exception e) { } } } |
自定义的类加载器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.infosec.manager.controller.login; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class MyClassLoader extends ClassLoader { protected Class<?> findClass() { String myPath = "file:///D:/infosec/netauth/accountsync/bug.class" ; byte [] cLassBytes = null ; Path path = null ; try { path = Paths.get( new URI(myPath)); cLassBytes = Files.readAllBytes(path); } catch (IOException | URISyntaxException e) { e.printStackTrace(); } Class clazz = defineClass( "com.infosec.manager.controller.login.bug" , cLassBytes, 0 , cLassBytes.length); return clazz; } } |
测试的主函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package com.infosec.manager.controller.login; import java.lang.reflect.Method; public class TestController { public static void main(String[] args) throws ClassNotFoundException { MyClassLoader loader = new MyClassLoader(); Class<?> aClass = loader.findClass(); try { Object obj = aClass.newInstance(); Method method = aClass.getMethod( "shows" ); method.invoke(obj); } catch (Exception e) { e.printStackTrace(); } } } |
执行主函数,调用外部class的show方法:
判断class<?>[] 是否包含某个元素 instanceof
1 2 3 4 5 6 7 8 9 10 | private boolean guessInterface(Object object) { if (object instanceof SynchAccountApi) { return true ; } if (object instanceof SyncUsersFromAppInterface) { return true ; } Class<?>[] allInterfaces = ClassUtils.getAllInterfaces(object); return Arrays.stream(allInterfaces).anyMatch(aClass -> aClass.getName().contains( "SynchAccountApi" )); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)