news 2026/2/28 11:19:33

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/2/27 5:46:16

Mixamo动画转换器:从Blender到Unreal Engine的根运动完整解决方案

Mixamo动画转换器&#xff1a;从Blender到Unreal Engine的根运动完整解决方案 【免费下载链接】mixamo_converter Blender addon for converting mixamo animations to Unreal 4 rootmotion 项目地址: https://gitcode.com/gh_mirrors/mi/mixamo_converter 想要让Mixamo…

作者头像 李华
网站建设 2026/2/25 9:16:54

Java工程师Python实战教程:通过MCP服务器掌握Python核心语法

核心目标 本指南专为Java工程师设计&#xff0c;通过使用Python构建MCP&#xff08;Model Context Protocol&#xff09;服务器这一实际项目&#xff0c;系统讲解Python语法要点。我们将采用"结果导向"模式&#xff1a;先展示完整代码&#xff0c;再逐行解析Python语…

作者头像 李华
网站建设 2026/2/19 9:12:20

R3nzSkin英雄联盟皮肤修改器:免费体验全英雄皮肤的秘密武器

R3nzSkin英雄联盟皮肤修改器&#xff1a;免费体验全英雄皮肤的秘密武器 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL).Everyone is welcome to help improve it. 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin 还在为英雄联盟中那些昂…

作者头像 李华
网站建设 2026/2/27 5:19:41

突破语言壁垒:jsPDF多语言PDF文档生成实战指南

突破语言壁垒&#xff1a;jsPDF多语言PDF文档生成实战指南 【免费下载链接】jsPDF 项目地址: https://gitcode.com/gh_mirrors/jsp/jsPDF 你是否曾经遇到过这样的场景&#xff1a;精心生成的PDF文档在海外客户那里显示异常&#xff0c;阿拉伯语文本错乱不堪&#xff0c…

作者头像 李华
网站建设 2026/2/25 4:08:33

Zygisk-Il2CppDumper完整指南:绕过保护实现Unity游戏动态分析

Zygisk-Il2CppDumper完整指南&#xff1a;绕过保护实现Unity游戏动态分析 【免费下载链接】Zygisk-Il2CppDumper Zygisk-Il2CppDumper - 利用 Zygisk 框架在运行时转储 Il2Cpp 数据的工具&#xff0c;可以绕过保护、加密和混淆&#xff0c;适合移动安全研究者和逆向工程师。 …

作者头像 李华
网站建设 2026/2/21 5:13:00

如何快速生成专业数据库文档:DBCHM终极使用教程

在软件开发过程中&#xff0c;数据库结构文档的编写往往是一项耗时且容易遗漏的工作。开发人员经常面临文档与数据库结构不同步、文档格式不统一、维护成本高等痛点。DBCHM数据库字典生成工具应运而生&#xff0c;它能够自动分析数据库结构并生成多种格式的文档&#xff0c;支持…

作者头像 李华