- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Java类加载机制面试题及答案
1.说说Java类加载的完整流程?
答:简单说分5步:加载→链接→初始化→使用→卸载,核心是前3步。
加载:通过类的全限定名(比如com.test.User)找到字节流(可能从jar、class文件、网络来),把字节流转成JVM能识别的运行时数据结构,最后在方法区生成一个Class对象(作为这个类的访问入口)。
链接:又分3小步——验证(检查字节码是否符合JVM规范,比如魔数0xCAFEBABE对不对)、准备(给类的静态变量分配内存,赋默认值,比如staticinta会先设为0,不是代码里的初始值)、解析(把符号引用转成直接引用,比如把代码里的“User”转成方法区里User类的实际地址)。
初始化:执行静态代码块和静态变量的赋值语句(比如staticinta=10,这步才会把a设为10),触发时机一般是“主动使用”时(比如new对象、调用静态方法、反射访问等)。
2.常见的类加载器有哪些?各自负责加载什么类?
答:主要分4种,遵循“双亲委派”的层级关系:
启动类加载器(BootstrapClassLoader):最顶层,C++写的(不是Java类),负责加载JRE核心类,比如rt.jar里的java.lang.String、java.util.ArrayList这些。
扩展类加载器(ExtensionClassLoader):Java写的,加载JRE扩展目录里的类(比如jre/lib/ext目录下的jar)。
应用程序类加载器(ApplicationClassLoader):也叫系统类加载器,加载我们自己写的代码(classpath下的类,比如项目里的com.test包下的类)。
自定义类加载器:我们自己继承ClassLoader写的,比如加载加密的class文件、从数据库读字节流加载类,常见于框架(比如Tomcat的WebAppClassLoader)。
3.什么是双亲委派模型?它有什么用?
答:原理很简单:加载一个类时,先让“父加载器”去加载,父加载器加载不了,再自己加载。这里的“父”不是继承关系,是组合(比如AppClassLoader里持有ExtClassLoader的引用)。
作用有两个核心:
防止类重复加载:比如你自己写了个java.lang.String,AppClassLoader会先委托Ext,Ext再委托Bootstrap,Bootstrap已经加载过rt.jar里的String了,就不会再加载你的,避免同一个类出现两个版本。
保证核心类安全:JVM核心类(比如java.lang包下的)只能由Bootstrap加载,你没法用自定义类加载器去篡改,比如不能写个java.lang.Integer去替换系统的,防止恶意代码破坏。
4.怎么打破双亲委派模型?举个实际例子
答:双亲委派不是强制的,因为ClassLoader的loadClass方法可以重写(不过JDK1.2后推荐重写findClass,而不是直接改loadClass)。打破的核心是:让子加载器先加载,不先委托父加载器。
实际例子:
Tomcat的类加载器:每个Web应用有自己的WebAppClassLoader,它会先加载WEB-INF/classes和WEB-INF/lib下的类,加载不到再委托父加载器(打破了“先委托父”的规则)。因为如果按双亲委派,多个Web应用用同一个类的不同版本(比如不同版本的Spring),会冲突,Tomcat这样做能实现类隔离。
JDBC加载驱动:JDBC的Driver接口在rt.jar里(由Bootstrap加载),但具体的驱动实现(比如mysql-connector的Driver类)在第三方jar里(Bootstrap加载不到)。所以DriverManager会用“线程上下文类加载器”(默认是AppClassLoader)去加载驱动类,这也打破了双亲委派——Bootstrap加载的类,反过来用子加载器去加载其他类。
5.ClassLoader的核心方法有哪些?各自作用是什么?
答:关键是3个方法:
loadClass(Stringname):加载类的入口,默认实现是双亲委派逻辑——先调用父加载器的loadClass,父加载不了再调用自己的findClass。
findClass(Stringname):负责“找字节流”,默认实现是空的(需要自定义类加载器时重写),比如从磁盘读
您可能关注的文档
最近下载
- 2022二级建造师管理章节练习3.31.docx VIP
- 高中生物实验中生态瓶制作与观察的实验课题报告教学研究课题报告.docx
- 广东省装配式建筑评价标准DBJT15-163-2019.pdf VIP
- 分级护理团体标准解读.pptx VIP
- 2025年1月江苏自考《03954现代公文写作》考前押题密训复习资料.pdf
- T_FJLY 001-2022_自然教育基地质量评定.pdf VIP
- 第八单元+中华民族的抗日战争和人民解放战争+知识点总结 高一上学期统编版(2019)必修中外历史纲要上.docx VIP
- 2025年房地产经纪人房地产经纪门店选址与区域市场特点分析专题试卷及解析.pdf VIP
- 米家米家无雾加湿器3 「800」使用说明书.pdf
- 超市联营商家管理制度优质文档.doc VIP
原创力文档


文档评论(0)