`

Java类加载器及类的生命周期与初始化过程

 
阅读更多
一、类加载器是什么?
将class文件预先加载到jvm虚拟机机制。

二、JVM中存在以下三种类加载区
1、根加载器(BootStrap ,C++实现)
2、扩展加载器(Ext ,java实现)
3、系统类加载器(system,java实现)
分别有不同的作用域:
1、根加载器,加载jre之下类文件,如rt.jar出ext文件之外
2、扩展加载器,加载jre/ext之外的类文件
3、系统类加载器,加载App ClassPath指定路径下的类

三、类加载器加载模式
为了保持完整性及一致性,java的类加载机制采用了双亲委派模式进行类加载,
双亲委派模式只的是,在类加载的时候,预先使用指定加载器的父类加载器去加载class文件,当父加载器return空的时候,子加载器才进行加载
BootStrap为最高级别的加载器。

四、自定义类加载器
自定义的类加载器必须继承抽象类ClassLoader然后重写findClass方法,其实他内部还有一个loadClass方法和defineClass方法,另外两种不推荐使用,严重破坏双亲委派模型,
下面代码从网上抄下来的,一个自定义加载器的实现如下:
/**
     * 一、ClassLoader加载类的顺序
     *  1.调用 findLoadedClass(String) 来检查是否已经加载类。
     *  2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
     *  3.调用 findClass(String) 方法查找类。
     * 二、实现自己的类加载器
     *  1.获取类的class文件的字节数组
     *  2.将字节数组转换为Class类的实例
     * @author lei 2011-9-1
     */ 
    public class ClassLoaderTest { 
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { 
            //新建一个类加载器 
            MyClassLoader cl = new MyClassLoader("myClassLoader"); 
            //加载类,得到Class对象 
            Class<?> clazz = cl.loadClass("classloader.Animal"); 
            //得到类的实例 
            Animal animal=(Animal) clazz.newInstance(); 
            animal.say(); 
        } 
    } 
    class Animal{ 
        public void say(){ 
            System.out.println("hello world!"); 
        } 
    } 
    class MyClassLoader extends ClassLoader { 
        //类加载器的名称 
        private String name; 
        //类存放的路径 
        private String path = "E:\\workspace\\Algorithm\\src"; 
        MyClassLoader(String name) { 
            this.name = name; 
        } 
        MyClassLoader(ClassLoader parent, String name) { 
            super(parent); 
            this.name = name; 
        } 
        /**
         * 重写findClass方法
         */ 
        @Override 
        public Class<?> findClass(String name) { 
            byte[] data = loadClassData(name); 
            return this.defineClass(name, data, 0, data.length); 
        } 
        public byte[] loadClassData(String name) { 
            try { 
                name = name.replace(".", "//"); 
                FileInputStream is = new FileInputStream(new File(path + name + ".class")); 
                ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
                int b = 0; 
                while ((b = is.read()) != -1) { 
                    baos.write(b); 
                } 
                return baos.toByteArray(); 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
            return null; 
        } 
    } 

上面主要记录的是java类加载器,下面记录下一个类的生命周期
类的生命周期为加载、链接(验证、准备、解析)、初始化、使用、卸载5个阶段 
1、类加载,类加载就是上述所说的将类使用类加载器加载到虚拟机中
2、链接(验证、准备、解析)
验证:对装载到jvm的字节码进行验证
a、验证是否虚拟机可读字节码,验证魔数
b、验证字节码与jvm中所支持的版本是否正确,魔数后8个字节码
c、类中的方法等一些列存在是否合法,jvm对class文件的字节码有严格的规则要求
准备:准备阶段,为类中的静态变量分配内存,即放入jvm的方法区的常量池之中,需要注意的是,如果静态变量没有使用final修饰,放入方法区的值是初始值。我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。
解析:为准备阶段准备好的静态变量符号引用构建引用
3、初始化:初始化有以下4种方式
如果一个类被直接引用,就会触发类的初始化。在java中,直接引用的情况有:
通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。
通过反射方式执行以上三种行为。
初始化子类的时候,会触发父类的初始化。
作为程序入口直接运行时(也就是直接调用main方法)。






分享到:
评论

相关推荐

    Java类加载器:静态变量初始化.docx

    在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...

    Java类加载器.pdf

    它不仅管理类的生命周期,还确保了类的正确加载和初始化,是Java动态特性的基石。 #### 类加载器的工作原理 Java类加载器遵循按需加载原则,即只有当应用程序真正需要使用某个类时,类加载器才会去加载它。这一...

    Java的类加载器

    Java的类加载器是Java虚拟机(JVM)的核心组件之一,它负责将类的字节码文件从文件系统或网络中加载到JVM中,然后进行校验、解析和初始化,使得Java程序能够运行。类加载器的概念是Java动态加载和运行时类重定义的...

    Java中类的生命周期

    在Java中,类的生命周期是从类被加载、连接、初始化开始,直到类被卸载结束。 ##### 加载阶段 - **加载的目标** 加载阶段的最终目标是实现将编译后的`.class`文件中的二进制数据加载到JVM的运行时数据区的方法区...

    Java虚拟机和Java程序的生命周期?

    类加载器负责将Java类加载到内存中,并对类进行验证、解析以及初始化等操作。 - **类加载器分类**: - **启动类加载器(Bootstrap ClassLoader)**:它是所有类加载器的父类,用于加载Java的核心库(如java.lang....

    Java虚拟机JVM类加载初始化

    Java虚拟机JVM类加载初始化是Java程序运行过程中的关键环节,它负责将类的字节码文件加载到内存中并进行相应的处理,以便程序能够正确执行。在Java中,类加载器(Classloader)扮演着核心角色。下面将详细讨论类加载...

    java 类加载器 java 类加载器 java 类加载器详解

    我们编写的“.java”扩展名的源代码文件中存储着要执行的程序逻辑,这些文件需要经过java编译器编译成“.class”...一个类的生命周期从类被加载、连接和初始化开始,只有在虚拟机内存中,我们的java程序才可以使用它。

    java class loader(JAVA类加载器)

    Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(AppClassLoader)。启动类加载器负责加载JRE核心库,如`rt.jar`;扩展类加载器...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    java 类加载器学习笔记1

    Java 类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的.class文件从文件系统或网络中加载到内存中,并将其转换为运行时的类对象。类加载器的这种动态加载机制为Java提供了极高的灵活性,使得程序可以在运行...

    java类加载机制

    类加载机制不仅涉及到类的加载、验证、准备、解析和初始化等步骤,还包括类加载时机的选择及类加载器的具体工作原理等内容。 #### 一、类加载时机 Java类的生命周期主要包括以下几个阶段:加载、验证、准备、解析...

    Java中类的生命周期.doc

    类的加载、连接和初始化是这一过程中的关键步骤,通过类加载器实现了类的动态加载,增强了Java程序的灵活性和安全性。掌握这些基础知识不仅有助于编写更高效的代码,还能在解决实际问题时更加得心应手。

    java 静态代码块通过类加载器获取资源文件例子

    总之,通过Java的静态代码块和类加载器,我们可以有效地管理和加载资源文件,特别是属性配置文件,确保在程序启动时即完成初始化工作,提升应用性能。这种技术在大型复杂系统中尤其常见,因为它能够保证配置的正确性...

    JVM类加载器说明文档

    类加载器不仅涉及类的加载,还关系到类的可见性和生命周期管理。例如,不同类加载器加载的类之间默认是不可见的,除非有明确的导包声明。此外,类的卸载在Java中相对复杂,通常只有在以下情况才会发生:类的加载器被...

    Java类重新加载101对象类和类加载器Java开发Jav

    在“Java类重新加载101对象类和类加载器”的主题中,开发者还需要理解类加载的生命周期、类的可见性以及类加载器的层次结构。这些都是深入学习Java动态性的重要部分,也是提升开发技能和解决问题的关键。通过深入...

    Java类加载说明

    在这个过程中,类加载器(ClassLoader)扮演着关键角色,它负责查找并加载Java类的字节码文件。本文将深入探讨Java类加载的原理、过程以及相关知识点。 首先,我们需要理解类加载的三个基本阶段:加载、验证、准备...

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    深入java虚拟机(二)——类的生命周期(上)类的加载和连接1

    本文将重点探讨类加载器的角色,以及类的加载、连接和初始化这三个阶段。 1. **类加载**: 类加载是JVM获取Java类字节码文件并将其转换为内存中`java.lang.Class`对象的过程。这个过程通常由类加载器完成。Java源...

    Java虚拟机----类的加载过程.docx

    Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...

Global site tag (gtag.js) - Google Analytics