JAVA-类加载机制(3)-类加载器

类加载器

作用:通过类全限定名来获取二进制字节流

用例:类层次划分,OSGi,热部署,代码加密

1,类和类加载器

  任意一个类和加载该类的加载器一同确立在虚拟机中的唯一性;

  每个类拥有独立的类名称空间;

  判断两个类是否相等,必须建立在同一个类加载器加载的前提下;否则会影响:equals, isAssignableFrom, isInstance, instanceof结果

package com.classload.temp;

import java.io.IOException;
import java.io.InputStream;

public class MainTest {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        ClassLoader myLoader = new ClassLoader(){
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {

                try {
                    String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    InputStream is = getClass().getResourceAsStream(fileName);
                    if(is == null){
                        return super.loadClass(name);
                    }

                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b, 0, b.length);
                } catch (IOException e) {
                    throw new ClassNotFoundException(name);
                }
            }
        };

        Object obj = myLoader.loadClass("com.classload.temp.MainTest").newInstance();
        System.out.println(obj.getClass());
        System.out.println(obj instanceof com.classload.temp.MainTest);

        /**
         * 执行结果:
         *    class com.classload.temp.MainTest
         *    false                                  //obj使用了myLoader自定义类加载器,MainTest使用了应用程序类加载器,加载器不用所以为false
         */
    }
}

2,双亲委派模型

类加载器分类

方式一:①,启动类加载器: C++实现,是虚拟机自身一部分

      ②,其他类加载器:JAVA实现,独立于虚拟机外部,全部继承自抽象类java.lang.ClassLoader

方式二:①,启动类加载器:加载JAVA_HOME/lib目录,或被-Xbootclasspath指定路径下,并被虚拟机识别的类库加载到虚拟机内存中

               启动加载器不能被用户直接引用

               用户编写自定义类加载器,需要把加载请求委派给引导类加载器,自定义类加载器使用null代替即可

    ②,扩展类加载器:加载JAVA_HOME/lib/ext目录下,或被java.ext.dirs系统变量指定的路径下类库

             扩展类加载器可以直接被用户使用

             sun.misc.Launcher$ExtClassLoader实现

    ③,应用程序类加载器:加载用户类路径上所指定的类库

               该类加载器是ClassLoader中getSystemClassLoader()方法的返回值,有名系统类加载器

             该类加载器可以直接被用户使用

             sun.misc.Launcher$AppClassLoader实现

          

类加载器之间的关系使用了组合关系复用父类加载器代码,而不是继承;

双亲委派模型工作过程:

  如果一个类加载器收到类加载器的请求,首先不会自己尝试加载,而是将该请求委派给父类加载器完成,每个层次的类加载器都是如此;

  因此所有类加载请求最终都传送到顶层的类加载器中,只有当父类加载器无法加载时(搜索范围内未找到该类),子加载器才会去加载。

双亲委派模型优点:

  ①,java类随着它的类加载器一起具备了一种带有优先级的层次关系

    如:java.lang.Object存放于rt.jar中无论哪个类加载器加载该类,都会被委派到顶层启动类加载器进行加载,

        因此Object类在程序的各种类加载器中都是同一个类

    如:编写与rt.jar类库中同名的java类,可以正常编译但是永远无法被加载运行(因为双亲委派)  

  ②,双亲委派模型并不是强制性的约束模型    

双亲委派原理:

  1,检查该类是否被加载过

  2,没有加载过:

        父类加载器非空:调用父类加载器的loadClass()方法,

        父类加载器为空:默认使用启动类加载器作为父类加载器

        父类加载器加载失败:调用自己的findClass()方法加载

3,破坏双亲委派模型

   

时间: 2024-10-12 05:29:43

JAVA-类加载机制(3)-类加载器的相关文章

jvm之java类加载机制和类加载器(ClassLoader)的详解

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.连接.初始化3个步骤来对该类进行初始化.如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化. 一.类加载过程 1.加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象. 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础

一文读懂Java类加载机制

Java 类加载机制 Java 类加载机制详解. @pdai Java 类加载机制 类的生命周期 类的加载:查找并加载类的二进制数据 连接 验证:确保被加载的类的正确性 准备:为类的静态变量分配内存,并将其初始化为默认值 解析:把类中的符号引用转换为直接引用 初始化 使用 卸载 类加载器, JVM类加载机制 类加载器的层次 寻找类加载器 类的加载 JVM类加载机制 自定义类加载器 参考文章 类的生命周期 其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段.在这五个阶段中,加载.验证.准

JVM的类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备.解析).初始化 如下图所示: 1.加载: 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,作为方法区这个类的数据访问的入口. 也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象.具体包括以下三个部分: (1)通过类的全

JVM学习笔记三:JVM类加载机制

概述 Class文件最终需要加载到虚拟机中之后才能运行和使用.虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用.卸载 7个阶段.其中验证.准备.解析部分统称为连接.七个阶段发生顺序如下: java中,类型的加载.连接和初始化过程都是在程序运行期间完成的.加载.验证.准备.初

转载---虚拟机类加载机制

虚拟机类加载机制  虚拟机把描述的类的数据从class文件加载到内存后,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.  类加载的时机 类被加载到虚拟机内存开始,到卸载出内存为止.它的整个生命周期包括:类加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)7个阶段.其中验证,准备,解析

JVM之类加载机制

JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的入口.注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP文件转换成对应的Class类). 验证 这一阶

JVM类加载机制一

类加载的过程 什么是类加载?Java编译器会将我们编写好的代码编译成class字节码文件,JVM会把这些class字节码文件加载到内存中,并对加载的数据进行校验.准备.解析并初始化,这个过程就是类加载机制.类加载分为三个阶段:加载,连接,初始化. 这三个阶段都是在程序运行期间完成的.其中加载,校验,准备,初始化,卸载的顺序都是确定的,解析可能会在初始化之后完成. JVM 可以选择符号引用解析的时机,一种是当类文件加载并校验通过后,这种解析方式被称为饥饿方式.另外一种是符号引用在第一次使用的时候被

深入理解Java:类加载机制及反射

一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示

Java基础加强——类加载机制

什么叫类加载 JVM把 .class 字节码文件加载到内存,并进行相关的校验.解析.初始化,最终转换为虚拟机可用的JAVA类型的过程,称为JVM类加载机制. (当然,JVM并不关心class文件的来源,什么?什么叫class文件?--每一个Java class文件都对一个Java类或者Java接口做出了全面描述) 类加载器的分类 启动(Bootstrap)类加载器:引导类装入器是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面的核心类库或-Xbootcla

Java基础知识之类加载器

1.类加载器定义 1.1类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制.JVM中用来完成上述功能的具体实现就是类加载器.类加载器读取.class字节码文件将其转换成java.lang.Class类的一个实例.每个实例用来表示一个java类.通过该实例的newInstance()方法可以创建出一个该类的对象. 1.2类的生命周期: 类从加载到虚拟