Java 加载器

类的加载是由类加载器完成的,类加载器包括:

根加载器( BootStrap )、扩展加载器( Extension )、系统加载器( System )和用户自定义类加载器( java.lang.ClassLoader 的子类)。

从 Java 2 ( JDK 1.2 )开始,类加载过程采取了父亲委托机制(PDM )。

PDM 更好的保证了 Java 平台的安全性,在该机制中, JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。

类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。

JVM 不会向 Java 程序提供对 Bootstrap 的引用。下面是关于几个类加载器的说明:

  • Bootstrap :一般用本地代码实现,负责加载 JVM 基础核心类库$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类
  • Extension :从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap ;
  • system class loader :又叫应用类加载器,其父类是 Extension 。它是应用最广泛的类加载器。它从环境变量 classpath或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。
  • 用户自定义类加载器: java.lang.ClassLoader 的子类;应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

父类委托机制是可以修改的,有些服务器就是自定义类加载器优先的。

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

时间: 2024-08-11 14:51:43

Java 加载器的相关文章

java 27 - 1 反射之 类的加载器

说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象. 连接: 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 初始化: 就是我们以前讲过的初始化步骤 类初始化时机: 创建类的实

java 自定义类的加载器

首先介绍自定义类的应用场景: (1)加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加密后就不能再用Java的ClassLoader去加载类了,这时就需要自定义ClassLoader在加载类的时候先解密类,然后再加载. (2)从非标准的来源加载代码:如果你的字节码是放在数据库.甚至是在云端,就可以自定义类加载器,从指定的来源加载类. (3)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节

java中三个类别加载器的关系以及各自加载的类的范围

Java在需要使用类别的时候,才会将类别加载,Java的类别载入是由类别载入器(Class loader)来达到的,预设上,在程序启动之后,主要会有三个类别加载器:Bootstrap Loader.ExtClassLoader与AppClassLoader. Bootstrap Loader是由C++撰写而成,预设上它负责搜寻JRE所在目录的classes或lib目录下的.jar档案中(例如rt.jar)是否有指定的类别并加载(实际上是由系统参数sun.boot.class.path指定):预设

【深入理解Java虚拟机 】类的加载器

1. 类加载器的分类 JVM 自带的类加载器 根类加载器( BootStrap ) 拓展类加载器 ( Extension ) 系统 (应用) 加载器 ( System / AppClassLoader) 开发者自己创建的类加载器 java.long.ClassLoader 的子类 public abstract class ClassLoader { // 抽象类,不能实例化吗,需要继承并重写其方法 } 2. 加载时机 类加载器不是在 "首次主动" 使用的时候采取尝试加载一般情况下回提

Java 理解类加载过程 -- 自定义加载器

类加载器可以看下我的收藏: https://www.cnblogs.com/dongguacai/p/5879931.html 现在准备一个字节码文件: 自定义加载器: 1 package com.xzlf.test; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8

03-类加载器

类加载器 类加载定义:通过一个类的全限定名来获取描述此类的二进制流来获取所需要的类的动作 类从被加载到虚拟机内存中开始,到卸载出内存生命周期分为以下7个阶段: 加载(Loading) -> [验证(Verification) -> 准备(Preparation) -> 解析(Resolution)] -> 初始化(Initialization) -> 使用(Using) -> 卸载(Unloading) 验证.准备和解析统称为连接(Linking) 主动引用(会触发类初

黑马程序员-张老师加强6-类加载器

类加载器: 基本概念: 一般来说:java文件(源程序)经过编译器被转换成java字节码.类加载器负责读取字节码文件,并转换成java.lang.class的一个实例对象.每个这样的实例代表一个java类.通过实例的newInstance方法,就可以创建出该类一个对象. Java.lang.ClassLoader类的介绍: ClassLoader类的基本职责就是根据指定的类的名称,找到或生产对应的字节码,然后从这些字节码中定义出一个java类.即,java.lang.Class的一个实例. 常用

Java加载jar文件并调用jar文件当中有参数和返回值的方法

在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成hello.jar文件. 1 package org.lele.fatpanda; 2 3 public class Util 4 { 5 public static String myName; 6 /* 7 * 无参数,无返回值的方法. 8 */ 9 public static void get

java加载机制整理

本文是根据李刚的<疯狂讲义>作的笔记,程序有的地方做了修改,特别是路径,一直在混淆,浪费了好多时间!!希望懂的同学能够指导本人,感激尽............ 1.jvm 和 类的关系 当调用 java命令运行一个java程序时,必会启动一个jvm即java虚拟机.(5.6.处有联系!!)该java程序的所有线程,变量都处于jvm中,都使用该jvm的内存区 jvm终止的情况:1.程序自然运行结束2.遇到System.exit();Runtime.getRuntime.exit();3.遇到未捕