请选择 进入手机版 | 继续访问电脑版

好程序员-千锋教育旗下高端IT职业教育品牌

400-811-9990
我的账户
好程序员

专注高端IT职业培训

亲爱的猿猿,欢迎!

已有账号,请

如尚未注册?

[JavaEE] 好程序员Java培训分享Java面试题之加载机制

[复制链接]
叶子老师 发表于 2019-9-19 14:50:31 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
好程序员Java培训学习路线分享Java面试题之加载机制,面试场景:

面试官第一问:

请问,我现在编写一个类,类全名如下:java.lang.String,我们知道JDK也给我们听过了一个java.lang.String,那么,我们编写的这个String类能否替换到JDK默认提供,也就是说程序实际运行的时候,会加载我们的String还是JDK的String?为什么?

如果,你无法确定?那么第二问:

了解类的加载机制吗?知道JDK的类加载器吗?双亲委托机制说说看

如果,你还不了解,那么我们聊聊今天的天气吧!

1,首先,什么是类的加载机制?

JVM使用Java类的流程如下:1,Java源文件----编译---->class文件2,类加载器ClassLoader会读取这个.class文件,并将其转化为java.lang.Class的实例。有了该实例,JVM就可以使用他来创建对象,调用方法等操作了。那么ClassLoader是以一种什么机制来加载Class的?这就是我们要谈的类的加载机制!

2,搞清楚这个问题,首先要知道,我们用到的Class文件都有哪些来源?

1,Java内部自带的核心类,位于$JAVA_HOME/jre/lib,其中最著名的莫过于rt.jar2,Java的扩展类,位于$JAVA_HOME/jre/lib/ext目录下3,我们自己开发的类或项目开发用到的第三方jar包,位于我们项目的目录下,比如WEB-INF/lib目录

3,那么,针对这些Class,JDK是怎么分工的?谁来加载这些Class?

针对不同的来源,Java分了不同的ClassLoader来加载1,Java核心类,这些Java运行的基础类,由一个名为BootstrapClassLoader加载器负责加载。这个类加载器被称为“根加载器或引导加载器”注意:BootstrapClassLoader不继承ClassLoader,是由JVM内部实现。法力无边,所以你通过java程序访问不到,得到的是null。2,Java扩展类,是由ExtClassLoader负责加载,被称为“扩展类加载器”。3,项目中编写的类,是由AppClassLoader来负责加载,被称为“系统类加载器”。

4, 那凭什么,我就知道这个类应该由老大BootStrapClassLoader来加载?

这里面就要基于双亲委托机制?

所谓双亲委托机制,就是加载一个类,会先获取到一个系统类加载器AppClassLoader的实例,然后往上层层请求,先由BootstarpClassLoader去加载,如果BootStrapClassLoader发现没有,再下发给ExtClassLoader去加载,还是没有,才由AppClassLoader去加载。如果还是没有,则报错

5,所以,上述问题的答案你清楚了吗?

JDK提供java.lang.String类,默认在rt.jar这个包里面,所以,默认会由BootstarpClassLoader加载,所以,我们自己编写的java.lang.String,都没有机会被加载到

6,给两段程序看看,类加载器的关系

案例1:创建一个自己的类,然后打印其类加载器

public class ClassLoaderTest {
public static void main(String[] args) throws ClassNotFoundException {
  Class<?> clazz = Class.forName("com.qianfeng.thread.client.Programmer");
  ClassLoader classLoader = clazz.getClassLoader();
  System.out.println(classLoader.getClass().getSimpleName());
}
}
案例2:打印其双亲类加载器信息

while(classLoader.getParent() != null){
       classLoader = classLoader.getParent();
       System.out.println("-->"+classLoader.getClass().getSimpleName());
}
好程序员Java培训官网:http://www.goodprogrammer.org/


精彩内容,一键分享给更多人!
回复

使用道具 举报

您需要登录后才可以回帖

本版积分规则

关注我们
好程序员
千锋好程序员

北京校区(总部):北京市海淀区宝盛北里西区28号中关村智诚科创大厦

深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619

杭州龙驰智慧谷校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层

郑州校区:郑州市二七区航海中路60号海为科技园C区10层、12层

Copyright 2007-2019 北京千锋互联科技有限公司 .All Right

京ICP备12003911号-5 京公安网11010802011455号

请您保持通讯畅通1对1咨询马上开启