news 2026/5/11 3:26:18

Java classloader

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java classloader

文章目录

  • Classloader的继承性。
  • Classloader的隔离性。
  • 简单的plugin classloader
  • 自定义classloader

Classloader的继承性。

第一级叫做bootstrap classloader,加载JDK自带的类,也就是${JAVA_HOME}/lib下的类。
第二级叫做extern classloader,加载${JAVA_HOME}/lib/ext下的类。
第三级叫做system classloader,加载第三方的类,就是classpath里其他的类。
第四级及更高级叫做plugin classloader,是用户自己写的classloader或者new出来的URLClassLoader,加载classpath以外的类。在tomcat容器中,每个应用里的WEB-INF/lib和WEB-INF/classes就是通过tomcat自定义的classloader去加载的。

Classloader的隔离性。

  1. 父级不能调用子级的类。
    比如extern classloader里加载的class不能调用system classloader加载的类,会抛class not found异常.
  2. 同一级不同classloader加载的类不能互相调用。
    比如有两个plugin classloader, loader A 与loader B。loader A加载的类class A不能调用loader B加载的类 class B.
  3. 无法获取bootstrap Classloader的实例。
    System.out.println(String.class.getClassLoader());
    这个输出结果是null
    总而言之,只能child加载的类调用parent加载的类。兄弟及各种远房亲戚不能互相调用。

简单的plugin classloader

直接使用jdk自带的url classloader就可以加载任意jar包里的类了。
比如以下代码

finalURLurl=newURL("file:///C:/Users/Ryan/IdeaProjects/learn/classloader/heap-1.0.jar");finalURLClassLoaderclassLoader=newURLClassLoader(newURL[]{url});finalClass<?>heapClass=classLoader.loadClass("net.cloudsun.head.SmallHeap");finalConstructor<?>constructor=heapClass.getConstructor();finalObjecto=constructor.newInstance();finalMethodadd=heapClass.getMethod("add",java.lang.Comparable.class);for(inti=0;i<10;i++){add.invoke(o,-i);}System.out.println(o);

自定义classloader

当不能提供url时,比如jar包不在磁盘里,也不在http服务器上,或者jar包是加密的。只能自己写classloader进行类的加载。
自己写classloader最终必须继承Classloader类。因为这个类有个保护型且final的defineClass方法,传入类的字节码,也就是byte[],就可以加载一个类。也就是说class的来源是byte[]。
比如

publicclassJarClassLoaderextendsClassLoader{@OverridepublicClass<?>loadClass(Stringname)throwsClassNotFoundException{// 从jar包里取byte数组try{JarFilejarFile=newJarFile("heap-1.0.jar");finalbyte[]bytes=JarUtils.getByte(jarFile,name);if(bytes==null){returnsuper.loadClass(name);}returnsuper.defineClass(name,bytes,0,bytes.length);}catch(IOExceptione){e.printStackTrace();returnnull;}}}

上述代码的JarUtils是一个自己写的工具类。

publicstaticbyte[]getByte(JarFilejarFile,StringclassName){finalStringentry=className.replace('.','/')+".class";finalJarEntryjarEntry=jarFile.getJarEntry(entry);if(jarEntry==null){returnnull;}try(finalInputStreaminputStream=jarFile.getInputStream(jarEntry)){returnIOUtils.toByteArray(inputStream);}catch(IOExceptione){e.printStackTrace();returnnull;}}

当然这个classloader写得并不规范。因为规范的classloader首先要调用parent classloader去加载类,如果parent加载失败,再自己加载,而且加载的class必须缓存起来。因为从字节码加载class的开销是非常巨大的。当然前三级JDK自带的的classloader都会在loadClass方法里去检查class是否已经加载。所以只要每级class loader优先调用parent classloader,就可以自动实现class的缓存。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 2:53:51

Modbus RTU波特率匹配问题:ModbusPoll实测指南

Modbus RTU通信调试实战&#xff1a;用ModbusPoll精准攻克波特率匹配难题在工业现场&#xff0c;你是否经历过这样的场景&#xff1f;硬件接线反复确认无误&#xff0c;从站地址也核对了三遍&#xff0c;可上位机就是收不到任何响应。日志里清一色的“Timeout”或“CRC Error”…

作者头像 李华
网站建设 2026/5/9 7:03:56

5分钟精通文档转换神器:Mammoth.js让Word转HTML变得如此简单

在现代办公和内容管理中&#xff0c;文档转换工具已成为不可或缺的助手。今天我们要介绍的Mammoth.js&#xff0c;就是一款专为Word转HTML设计的轻量级JavaScript库&#xff0c;它能将复杂的.docx文档高效转换为干净的HTML代码&#xff0c;支持浏览器和Node.js双环境运行&#…

作者头像 李华
网站建设 2026/5/9 0:31:10

抖音无水印下载完整攻略:高效保存高清原创视频的终极方案

还在为无法保存心仪的抖音视频而苦恼吗&#xff1f;douyin_downloader抖音无水印下载工具为您提供完美的解决方案&#xff0c;让您轻松实现抖音视频下载和无水印保存。无论您是技术小白还是资深玩家&#xff0c;都能快速上手这款强大的下载神器。 【免费下载链接】douyin_downl…

作者头像 李华
网站建设 2026/5/10 18:38:53

ColabFold蛋白质结构预测完整教程:从入门到精通

ColabFold蛋白质结构预测完整教程&#xff1a;从入门到精通 【免费下载链接】ColabFold 项目地址: https://gitcode.com/gh_mirrors/co/ColabFold 想要在个人电脑上就能预测蛋白质三维结构吗&#xff1f;ColabFold让这成为现实&#xff01;这个革命性的开源工具结合了D…

作者头像 李华
网站建设 2026/5/10 15:46:28

如何轻松下载A站视频?AcFunDown免费工具完整指南

如何轻松下载A站视频&#xff1f;AcFunDown免费工具完整指南 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 &#x1f633;仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 想要随时随地离线观看…

作者头像 李华
网站建设 2026/5/9 13:10:20

网页截图终极方案:html-to-image一键转换完整指南

还在为网页内容截图而烦恼吗&#xff1f;传统截图方式不仅效率低下&#xff0c;还经常遇到样式丢失、清晰度不足等问题。html-to-image 作为前端开发的利器&#xff0c;能够将任意DOM节点转换为高质量图片&#xff0c;完美解决网页内容导出的所有痛点。 【免费下载链接】html-t…

作者头像 李华