zoukankan      html  css  js  c++  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实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    8.4 确定两个日期之间的月份数或年数
    (Java实现) 洛谷 P1553 数字反转(升级版)
  • 原文地址:https://www.cnblogs.com/qfchen/p/11510682.html
Copyright © 2011-2022 走看看