RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
好程序员Java学习路线分享Java面试题之加载机制-创新互联

好程序员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.jar
2,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:创建一个自己的类,然后打印其类加载器

成都创新互联长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为文水企业提供专业的成都网站建设、做网站,文水网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
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());
}

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


文章标题:好程序员Java学习路线分享Java面试题之加载机制-创新互联
文章源于:http://lswzjz.com/article/dccsgc.html