01.类加载器

为什么要研究类加载的全过程?

---有助于理解JVM的运行过程

---更深入了解Java动态性(解热部署、动态加载),提高程序的灵活性

---最重要的一点儿是:有利于分析各种Web容器,Android插件化的原理

类加载机制

JVM将class文件加载到内存,并对数据进行校验、解析和初始化,最终形成JVM能够直接使用的Java类型的过程

抄图如下:

类加载全过程

1、加载:

将字节码加载到内存中 ,并将这数据转换成方法区中运行的数据结构,在堆中生成一个表示这个类的java.lang.Class对象,作为方法区内数据的访问入口,当然这个过程需要类的加载器的参与

2、链接:

将Java类的二进制代码合并到JVM的运行状态中的过程,期间经过

1)验证:

--确保加载类的信息符合JVM规范,没有安全方面的问题

2)准备:

--正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都在方法区中进行分配

注意:在准备阶段为类变量进行赋初值,比如static int  a= 10;那么它的初始值是0,只有在初始化的时候,a的值才会变成10;

3)解析:

--虚拟机中常量池内的符号引用替换为直接引用的过程

注意字符串常量值:一般类名、方法名、参数名、变量名都属于常量。

3、初始化

1)初始化阶段是执行类构造器<clinit>()方法的过程,类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中语句合并产生的。

    类构造器是我们创建不了的。

2)当初始化一个类的时候,如果发现其父类还没有初始化,则需要先触发其父类的初始化

3)虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确的加锁和同步。

4)当访问一个Java类的静态域时,只有真正声明这个域的类才会被初始化。

此处需要一张图片

类的主动引用和被动引用

1.类的主动引用和被动引用(一定会发生类的初始化)

l   new一个类的对象

l   调用类的静态成员(除了final常量)和静态方法

l   使用java.lang.reflect包的方法对类进行反射和调用

l   当虚拟机启动,java Demo则一定会初始化Demo类,就是先启动main方法所在的类

l   当初始化一个类,如果它的父类没有被初始化,则先会初始化它的父类

2.类的被动引用不会发生初始化

l   通过数组定义类引用不会触发此类的初始化:

A a[] = new A[];这样不会触发A类的初始化。

l   当访问一个静态域时,只有真正声明这个域的类才会初始化:

通过子类访问父类声明的静态域的时候,父类会初始化,但是子类不会初始化。

时间: 2025-01-04 17:24:02

01.类加载器的相关文章

45_自定义类加载器的编写原理分析

知识讲解 自定义的类加载器必须继承ClassLoader loadClass方法与findClass方法 defineClass方法 编程步骤 编写一个对文件内容进行简单加密的程序. 编写一个自己的类加载器,可实现对加密过得类进行加载和解密. 编写一个程序调用类加载器加载类,在源程序中不能用该类名定义引用变量,因为编译器无法识别这个类.程序中可以除了使用ClassLoader.load方法之外,还可以使用设置线程的上下文类加载器或者系统类加载器,然后再使用Class.forName. 实验步骤:

深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题

一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的加载方式 1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar.zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 三.类加载的时机

Java 类加载器(转)

java虚拟机中可以安装多个类加载,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap(内嵌在java虚拟机中由C++编写),ExtClassLoader,AppClassLoad    类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap.    java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象    或者

java类加载器_01

1.概念: 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()方法就可以创建出该类的一个对象.实际的情况可能

Java类加载器深入探索

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 什么是.class文件? class文件全名称为Java class文件,主要在平台无关性和网络移动性方面使Java更适合网络.它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务.class文件径打破了C或者C++等语言所遵循的传统,使用这些传统语言写的程序通常首先被编译,然后被连接成单独的.专门支持特定硬件平台和操作系统的二进制文件.通常情况下,一个平台上的

Java基础加强-(注解,类加载器,servlet3.0新特性)

1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的“name=value”对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特

Java类加载器深入解析(二)

在做Java开发时了解Java类加载机制是非常好的.而对类加载机制的基本理解对Java开发人员处理类加载器(ClassLoader)相关的异常也很有帮助. 类加载器委托机制 Java类的装载是通过类加载器(CL)来完成的,这些类加载器负责将类加载到JVM中.简单的应用可以使用java平台自带的类加载器来加载自身的类,而稍微复杂一些的应用则倾向于自定义类加载来加载自身的类. 在java中类加载器是以树状结构组织的.通过请求一个类加载器并通过在其缓存中查找来确定某个类是否已被加载.如果在缓存中已经有

day19_java基础加强_动态代理+注解+类加载器

一.动态代理 1.1.代理模式 ? ? 什么是代理模式及其作用? ? ? ? ? Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一.? ? ? ? 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.? ? ? ? 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用.? ? 优点:? ? ? ? (1) 职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件

类加载器深入理解和双亲委托模型的案例分析

类加载器深入理解和双亲委托模型的案例分析 我们知道类必须通过类加载器加载后,我们程序才可以使用.接下来我们就对类加载器进行分析,Java虚拟机的类加载器是如何加载类的.首先我们可以从ClassLoader的源码分析入手. ClassLoader 的源码分析 ClassLoader 的javadoc文档 javadoc文档是最权威的官方讲解,可以对ClassLoader有一个比较全面且正确的一个认知.下面是javadoc内容. A class loader is an object that is