关于类加载器那点破事儿

Java的类加载器就是负责把.class文件加载到内存中的工具。据说,只有.class被加载如内存后才能被称为字节码。

Java的类加载器呈父子级联关系:

BootStrap --> ExtClassLoader --> AppClassLoader -- > 自定义类加载器

-- BootStrap 跟加载器,负责加载rt.jar这类的由Java自身提供的类,他是由C++编写的,所以当我们在程序里想要get他时,返回的是null

-- ExtClassLoader 扩展类加载器,负责加载jre/lib/ext 目录下的类

-- AppClassLoader 应用类加载器,负责加载classpath下的类

-- 自定义类加载器 继承自ClassLoader,可以实现自定义的类加载方式

Java的类加载使用所谓的“全盘委托”机制:

-- 当要加载一个类时,从负责加载这个类的类加载器开始,往上回朔所有父类加载器,如果被回朔过程中的某一个类加载器成功加载,则加载完成,如果回溯中所有父类加载器都无法加载(PS:这里说的无法加载是指当前这个类加载器负责的加载范围内找不到与这个要加载类的名字相同的类),则返还给负责加载这种类的类加载器进行加载,如果依旧无法加载,则会抛出ClassNotFoundException。也就是说,如果爸爸爷爷能加载这个类,就进行加载,如果不能加载,则还给儿子/孙子自己去加载。这个和实例化类比较类似,我们在实例化一个类时,JVM也是去实例化这个类的所有直接、间接父类。

-- 全盘委托机制的好处:保证了类加载的安全。比如我们自己写一个String类,当类开始加载时,会往上回朔,到了BootStrap根加载器,跟加载器发现他可以加载String类,但是他不会加载我们写的这个String类,而是去加载他本身负责范围内的String类,这样就保证了String类的正确加载,而不是让我们自定义的String类去覆盖了原有的String类。

自定义类加载器在很多地方都有出现,比如Tomcat里面就有很多自定义类加载器。实现一个自定义类加载器只需要继承ClassLoader,再重写findClass方法即可:

1 public class MyClassLoader extends ClassLoader {
2
3     @Override
4     protected Class<?> findClass(String name) throws ClassNotFoundException {
5         return super.findClass(name);
6     }
7
8 }

关于类加载器那点破事儿

时间: 2024-08-28 19:13:34

关于类加载器那点破事儿的相关文章

深入拆解类加载器,这样的姿势你还不懂吗?

本文导读: 1.前奏,举个生活中的小栗子 2.为何Java类型加载.连接在程序运行期完成? 3.一个类在什么情况下才会被加载到JVM中? 什么是主动使用.被动使用?代码示例助你透彻理解类初始化的时机. 4.类的加载(Loading)内幕透彻剖析 类加载做的那些事儿.双亲委派模型工作过程.ClassLoader源码解析 5.Tomcat如何打破双亲委派模型的 6.上下文类加载器深入浅出剖析 7.最后总结 1.前奏,举个生活中的小栗子 春节马上要到了,大家是不是都在迫不及待的等着回家团圆了呢? 大春

自定义一个类加载器

http://www.cnblogs.com/xrq730/p/4847337.html 为什么要自定义类加载器 类加载机制:http://www.cnblogs.com/xrq730/p/4844915.html 类加载器:http://www.cnblogs.com/xrq730/p/4845144.html 这两篇文章已经详细讲解了类加载机制和类加载器,还剩最后一个问题没有讲解,就是 自定义类加载器.为什么我们要自定义类加载器?因为虽然Java中给用户提供了很多类加载器,但是和实际使用比起

自定义类加载器——加载任意指定目录的class文件

public class MyClassLoader extends ClassLoader{ String path;//自定义类加载器所负责的文件夹 public MyClassLoader(String path) { super(); this.path = path; } @SuppressWarnings("deprecation") @Override protected Class<?> findClass(String name) throws Class

Java类加载器的工作原理

Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它.可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类 加载器加载的类.单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类.正确理解类加载器能够帮你解决 NoClassDefFoundError和java.lang.ClassNo

[email&#160;protected]动态代理-类加载器

一.测试单元     概述:用于测试JAVA代码的工具类,已内置在Eclipse中;     格式:         1.在方法的上面添加@Test;         2.对被测试的方法的要求:权限-public;返回值-void;参数-空参         [email protected]:在@Test标注的方法前执行,可以用于初始化;           @After:在@Test标注的方法后执行,可以用于释放资源; 二.注解     概述:java的一种数据类型,和类/接口在同一级别  

jvm学习二:类加载器

前一节详细的聊了一下类的加载过程,本节聊一聊类的加载工具,类加载器  ---  ClassLoader 本想自己写的,查资料的时候查到一篇大神的文章,写的十分详细 大家直接过去看吧http://blog.csdn.net/zhoudaxia/article/details/35824249

Java基础知识之类加载器

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

Java重要技术(28)类加载器之类加载器的层次关系和委托加载机制

1.1. 类加载器的层次 类加载器包括三种: Bootstrap ClassLoader:用于加载JRE的lib目录下的jar文件中的class. ExtClassLoader:用于加载JRE的lib/ext目录下的jar文件中的class. AppClassLoader:用于加载classpath下的class. 在加载一个class时,通常应该先委托给parent类加载器来加载,parent类加载器找不到这个类时,才自行加载.实际优先次序从高到低排列是BootStrap ClassLoade

Java重要技术(29)类加载器之类加载器的职责

1.1. 类加载器的职责 每个类(Class)都有一个类加载器.类加载器ClassLoader的职责包括以下内容: (1)类的定位.根据类的名称找到对应的class文件,也可以不需要class文件. (2)类的定义.产生表达类的定义的Class类的实例. 某个Sample类的代码如下: package com.test.javatechnology.classloader.test; //Sample类的class文件将位于test目录下. public class Sample { //NOT