关于JVM的ClassLoader(转)

众所周知,java是编译型的语言,写的是java文件,最后运行的是class文件,class文件是运行在JVM之中的,这时候就有一个问题,JVM如何装载class文件的?是通过ClassLoader来进行的,这里做一下笔记,因为发现原作者写的很好《深入分析java web 技术内幕》。

ClassLoader的结构分析

ClassLoader是一个抽象类,他有很多子类,JVM默认有几个实现类,当然我们也可以自己继承ClassLoader。

1、defineClass:将byte字节转换为JVM能够识别的Class对象,这样就意味着可以是class文件也可是是网络上的字节流了;

2、defineClass通常和findClass一起使用,findClass的作用是取得要加载的类的字节码;

3、如果想在类被加载到JVM的时候就被链接,可以调用resolveClass来完成;

4、如果不想自定义加载类的规则,也没有复杂的逻辑,可以通过this.getClass().getClassLoader().loadClass("") 来进行加载;

ClassLoader中的几个实现类

1、Bootstrap ClassLoader 这个是JVM加载自身工作需要的类,完全由JVM自己来控制,外部无法访问到这个;

2、ExtClassLoader比较特殊的,服务的特定目标在System.getProperty("java.ext.dirs");

3、AppClassLoader,父类是ExtClassLoader,"java.class.path"中的类都可以被这个类加载器加载;

4、URLClassLoader,一般这个类帮我们实现了大部分的工作,自定义可以继承这个类,这样仅仅在需要的地方做修改就行了;

JVM加载clas文件到内存的方式

1、显示加载:不通过代码里的ClassLoader调用,而是JVM来自动加载类到内存中的方式;

1.1、通过Class中的forName;

1.2、通过ClassLoader中的loadClass

1.3、通过ClasLoader中的findSystemClass

2、隐身加载:通过代码中ClassLoader来加载的方式;

如何加载class文件

1、找到.class文件,并把文件中包含的byte加载到内存中

2、验证和解析

2.1、字节码验证,确保格式正确和行为正确

2.2、类准备,类中定义的字段、方法和实现接口锁必须的数据结构

2.3、解析,装入类所引用的其他所有类,如父类、字段、方法签名、方法中使用的本地变量等

3、静态属性和初始化赋值,以及静态块的执行等

关于类加载过程中的几种常见异常

1、ClassNotFindException

JVM要加载指定的文件的字节码到内存中,但是并没有发现这个文件的字节码。检查方法就是在classpath中看看是否有指定文件存在。

2、NoClassDefFoundError

JVM规范中这个异常出现的情况是使用new 关键字、属性引用类、实现接口、继承类,如果不存在,会报这个异常。

3、ClassCastException

对于普通对象,对象必须是目标类的实例或者目标类的子类的实例,如果目标类是接口,那么会把他当做实现了该接口的一个子类。

有哪些需要自定义ClassLoader的情况?

1、在自定义的路径下查找自定义的classs文件,需要的文件并不是classpath下面的;

2、对于加载的类做特殊的处理,例如网络传输的安全性等;

3、可以定义类的失效机制,例如检查到文件被修改,则重新加载,从而实现类的热部署;

http://iamzhongyong.iteye.com/blog/2091549

时间: 2024-08-02 16:18:47

关于JVM的ClassLoader(转)的相关文章

JVM的ClassLoader过程分析

本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ClassLoader就是寻找类或是接口的字节码文件(.class)并通过解析字节码文件来构造类或接口对象的过程.在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:寻找文件.链接和初始化,其中链接又可以分成校验.准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个

JVM中classloader双亲委派

public class Test { public static void main(String[] args) { // TODO Auto-generated method stub ClassLoader cl = Test.class.getClassLoader(); while(cl!=null) { System.out.println(cl.getClass().getName()); cl = cl.getParent(); } System.out.println(cl)

JVM思考-ClassLoader.loadClasshe和Class.forName区别

JVM思考-ClassLoader.loadClasshe和Class.forName区别 目录:JVM总括:目录 见博客第四节:JVM总括四-类加载过程.双亲委派模型.对象实例化过程 原文地址:https://www.cnblogs.com/java-zzl/p/9905223.html

JVM的classloader(转)

Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存.    这四个类加载器分别为:Bootstrap ClassLoader.Extension ClassLoader.AppClassLoader和URLClassLoader,他们的作用其实从名字就可以大概推测出来了.其中AppClassLoader在很多地方被叫做System ClassLoaderBootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编

java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader.Extension ClassLoader.App ClassLoader,分别各司其职: Bootstrap ClassLoader     负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar.resources.jar.charsets.jar和class等 Ex

jvm学习-ClassLoader(二)

ClassLoader结构 jdk加载的4个步骤 CustomClassLoader 用户自定义的classLoader APPClassLoader主要加载classPath下面的class Extension ClassLoader 主要负责加载JAVA_HOME/jre/lib/ext/目下的所有jar        BootStrap ClassLoader:负责加载JDK中的核心类库,如:rt.jar.resources.jar.charsets.jar等 java类加载器采用双亲委托

JVM工作原理

JVM体系结构 jvm内部体系结构分三部分:类加载器  执行引擎 运行时数据区 类加载器  加载.class文件. 三个步骤:(1)装载.jvm通过ClassLoader 类名 包名将类的二进制字节码加载到jvm中完成类的加载工作.可以通过"类名+包名+ClassLoader实例ID"来标识一个被加载的类. (2)链接.加载完后,对二进制字节码格式进行验证,初始化加载类的静态变量并赋值为默认值,最后对类中方法.属性进行验证,确保其需要调用的属性.方法存在及具备相应权限(验证public

JVM内存划分总结

概述 在说jvm内存划分之前,先来说下java程序具体的执行流程: Java源文件经过java编译器编译后变成class字节码文件, Jvm的classloader加载class文件完成后,交由execution engine执行. 执行引擎执行过程中用到的所有数据和信息,都存储在runtime data area中. Runtime data  area 就是我们常说的JVM内存. Runtime data area Runtime data area 都包括什么呢? <Java虚拟机规范>

深入理解ClassLoader(四)—类的父委托加载机制

上几次我们介绍到了JVM内部的几个类加载器,我们来重新画一下这个图,再来看一下他们之间的关系. JVM的ClassLoader采用的是树形结构,除了BootstrapClassLoader以外?每个ClassLoader都会有一个parentClassLoader,用户自定义的ClassLoader默认的parentClassLoader是SystemClassLoader,当然你可以自己指定需要用哪一个ClassLoader的实例,我们来看他的API 默认的无参构造方法使用的是SystemCl