zoukankan      html  css  js  c++  java
  • Java类加载器

    1,什么是类加载器?
            加载类的工具.
     
    2,类加载器有什么作用?
            当程序需要的某个类,那么需要通过类加载器把类的二进制(也就是class文件)加载到内存中.
    类加载器也是Java类

    二、类加载。

    当我们使用一个类,如果这个类还未加载到内存中,系统会通过加载、连接、初始化对类进行初始化。

    1、类加载:指的是将类的class文件读入JVM,并为之创建一个Class对象。

    2、类连接:指的是把类的二进制数据合并到JRE中,这又分为3个阶段:

    a)、校验:检查载入Class文件数据的正确性。

    b)、准备:给类的静态变量分配存储空间,并进行默认初始化。

    c)、解析:将类的二进制数据中的符号引用替换成直接引用。

    3、初始化:对类的静态变量、静态初始化块进行初始化。

    (注意:一个final类型的静态属性,如果在编译时已经得到了属性值,那么调用该属性时,不会导致该类初始化,因为这个相当于使用常量;

    使用ClassLoader()方法,只是加载该类,并未初始化。)

    三、类加载器。

    类加载器就是负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象,它负责加载所有的类,而一旦一个类被加载入JVM中,就不会被再次载入了。

    在Java中,一个类用其全限定类名(即包名+类名)作为标识。

    而在JVM中,一个类用其全限定类名和其类加载器作为标识。

    JVM运行时会产生3个ClassLoader,分别为:BootstrapClassLoader(根类加载器)、ExtClassLoader(扩展类加载器)和AppClassLoader(系统类加载器)。UML结构如下:

    其中,BootstrapClassLoader负责加载JRE的核心类库,它不是ClassLoader的子类,使用C++编写,因此我们在Java中看不到它,通过其子类的getParent()方法获取时,将返回null。BootstrapClassLoader负责装载JRE目标下的rt.jar、charsets.jar等Java核心类库。

    如图可知,ExtClassLoader和AppClassLoader为ClassLoader的子类。在API中看不到它们,他们位于rt.jar文件中。全限定类名分别为:

    sun.misc.Launcher$ExtClassLoader 和 sun.misc.Launcher$AppClassLoader.

    其中,ExtClassLoader负责装载JRE扩展目录ext中JAR包,而AppClassLoader负责装载Classpath路径下的类包。

    测试如下:

    复制代码 代码如下:

    package com.stopTalking.crazy;
    public class TestClassLoader {
    public static void main(String[] args) {
    //获取当前线程的类装载器 
    ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
    //获取System类的类装载器 
    ClassLoader loader1 = System.class.getClassLoader(); 
    //获取本类TestClassLoader的类装载器loader2 
    ClassLoader loader2 = TestClassLoader.class.getClassLoader(); 
    //获取loader2的父类 
    ClassLoader loader3 = loader2.getParent(); 
    //获取loader2的父类的父类 
    ClassLoader loader4 = loader3.getParent(); 
    System.out.println(loader); 
    System.out.println(loader1); 
    System.out.println(loader2); 
    System.out.println(loader3); 
    System.out.println(loader4); 

    }

    控制台输出:

    复制代码 代码如下:

    //当前线程类获取的类加载器是AppClassLoader
    sun.misc.Launcher$AppClassLoader@6b97fd
    //System类为根装载器加载,java中访问不到,所以为null
    null
    //本类的类加载器当然也是AppClassLoader
    sun.misc.Launcher$AppClassLoader@6b97fd
    sun.misc.Launcher$ExtClassLoader@1c78e57
    null
  • 相关阅读:
    C# TryParse
    C#委托的学习笔记
    C#基础学习C# 8.0 In a Nut Shell
    Everything学习之三
    Everything学习笔记二
    搜索软件everything帮助文档全文翻译
    Git笔记之基础命令
    Git学习笔记
    附加属性
    日期函数
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5304983.html
Copyright © 2011-2022 走看看