- 浏览: 1112867 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
Java 的 Class 加载 步骤
一、背景知识
1. java.lang.ClassLoader类介绍
<Abstract> java.lang.ClassLoader
java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到其对应的二进制字节代码文件。
然后根据这个文件,生成一个 java.lang.Class 类的实例。
- part of methods in java.lang.ClassLoader
2. JVM中类加载器的树状层次结构
1) 引导类加载器(bootstrap class loader):
它用来加载 Java 的核心库(jre/lib/rt.jar)。
是用原生C++代码来实现的,并不继承自java.lang.ClassLoader。
2) 扩展类加载器(extensions class loader) :继承自 1)
它用来加载 Java 的扩展库(jre/ext/*.jar)。
Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
3) 系统类加载器(system class loader):继承自 2)
它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。
一般来说,Java 应用的类都是由它来完成加载的。
可以通过 java.lang.ClassLoader.getSystemClassLoader()来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承
java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
3. 双亲委派机制
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托交给父类加载器。
父类加载器又将加载任务向上委托,直到最父类加载器。
如果最父类加载器可以完成类加载任务,就成功返回。
如果不行就向下传递委托任务,由其子类加载器进行加载。
双亲委派机制的好处:
保证java核心库的安全性。
例如:
如果用户自己写了一个java.lang.String类就会因双亲委派机制不能被加载,
不会破坏原生的String类的加载。
二、类加载过程
JVM将类加载过程分为三个步骤:
1) 装载(Load):
查找并加载类的二进制数据。
2) 链接(Link):
语法验证:确保被加载类信息符合JVM规范、没有安全方面的问题。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把虚拟机常量池中的符号引用转换为直接引用。
Java 中,虚拟机会为每个加载的类维护一个常量池。
【不同于字符串常量池,这个常量池只是该类的字面值(
例如:类名、方法名)和符号引用的有序集合。
而字符串常量池,是整个JVM共享的】
这些符号(如int a = 5; 中的 a )就是符号引用,
而解析过程就是把它转换成指向该类在堆中生成的对象地址的相对地址。
3) 初始化(Initialize):
为类的静态变量赋予正确的初始值。
步骤:
1>. 如果这个类还没有被加载和链接,那先进行加载和链接。
2>. 假如这个类存在直接父类,并且该父类还没有被初始化(
注意:在一个类加载器中,类只能初始化一次),
那么先初始化其直接的父类(不适用于接口)
3>. 如果类中存在 static 语句块,那就依次执行这些初始化语句。
-
引用:
- 全面解析Java类加载器
http://www.cnblogs.com/sunniest/p/4574080.html
-
一、背景知识
1. java.lang.ClassLoader类介绍
<Abstract> java.lang.ClassLoader
java.lang.ClassLoader 类的基本职责就是根据一个指定的类的名称,找到其对应的二进制字节代码文件。
然后根据这个文件,生成一个 java.lang.Class 类的实例。
- part of methods in java.lang.ClassLoader
// 1. // get parent class loader. public java.lang.ClassLoader getParent() // 2. // load a class according its binary name, // return a class instance. public java.lang.Class<T> loadClass(String name) // 3. // Converts an array of bytes into an instance of class Class. protected final java.lang.Class<T> defineClass(String name, byte[] b, int off, int len) //
2. JVM中类加载器的树状层次结构
1) 引导类加载器(bootstrap class loader):
它用来加载 Java 的核心库(jre/lib/rt.jar)。
是用原生C++代码来实现的,并不继承自java.lang.ClassLoader。
2) 扩展类加载器(extensions class loader) :继承自 1)
它用来加载 Java 的扩展库(jre/ext/*.jar)。
Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
3) 系统类加载器(system class loader):继承自 2)
它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。
一般来说,Java 应用的类都是由它来完成加载的。
可以通过 java.lang.ClassLoader.getSystemClassLoader()来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承
java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
public class TestMClassLoader { public static void main(String[] args) throws Exception{ //current class loader. System.out.println(TestMClassLoader.class.getClassLoader()); //application class loader System.out.println(ClassLoader.getSystemClassLoader()); //extensions class loader System.out.println(ClassLoader.getSystemClassLoader().getParent()); //bootstrap class loader System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent()); } } /* output: sun.misc.Launcher$AppClassLoader@3e0ebb sun.misc.Launcher$AppClassLoader@3e0ebb sun.misc.Launcher$ExtClassLoader@39443f null */ /* 可以看出: ClassLoader 类是由 AppClassLoader 加载的,其父类是 ExtClassLoader 。 ExtClassLoader 的父类无法获取是因为它是用 C++ 实现的。 */
3. 双亲委派机制
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托交给父类加载器。
父类加载器又将加载任务向上委托,直到最父类加载器。
如果最父类加载器可以完成类加载任务,就成功返回。
如果不行就向下传递委托任务,由其子类加载器进行加载。
双亲委派机制的好处:
保证java核心库的安全性。
例如:
如果用户自己写了一个java.lang.String类就会因双亲委派机制不能被加载,
不会破坏原生的String类的加载。
二、类加载过程
JVM将类加载过程分为三个步骤:
1) 装载(Load):
查找并加载类的二进制数据。
2) 链接(Link):
语法验证:确保被加载类信息符合JVM规范、没有安全方面的问题。
准备:为类的静态变量分配内存,并将其初始化为默认值。
解析:把虚拟机常量池中的符号引用转换为直接引用。
Java 中,虚拟机会为每个加载的类维护一个常量池。
【不同于字符串常量池,这个常量池只是该类的字面值(
例如:类名、方法名)和符号引用的有序集合。
而字符串常量池,是整个JVM共享的】
这些符号(如int a = 5; 中的 a )就是符号引用,
而解析过程就是把它转换成指向该类在堆中生成的对象地址的相对地址。
3) 初始化(Initialize):
为类的静态变量赋予正确的初始值。
步骤:
1>. 如果这个类还没有被加载和链接,那先进行加载和链接。
2>. 假如这个类存在直接父类,并且该父类还没有被初始化(
注意:在一个类加载器中,类只能初始化一次),
那么先初始化其直接的父类(不适用于接口)
3>. 如果类中存在 static 语句块,那就依次执行这些初始化语句。
-
引用:
- 全面解析Java类加载器
http://www.cnblogs.com/sunniest/p/4574080.html
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 1065场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 488多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 484一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 462转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 548一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 693POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 1070观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 681https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 881https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 897一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20751package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 818Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5722三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 842一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1411一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5385Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3834一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2704一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1059单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5568一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。...Java动态加载class; Java覆盖已加载的class; Java自定义classloader;
Java中的类加载过程分为三个主要阶段:加载、验证、准备、解析和初始化。ClassLoader主要关注的是加载阶段,它根据全限定名(如"java.lang.String")找到对应的.class文件,并将其转换为Class对象。Java提供了三个...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
通过自定义ClassLoader和利用`JavaCompiler` API,我们可以实现Java源文件的动态编译和加载,从而实现程序运行时的灵活扩展。在实际应用中,我们需要注意类加载的性能影响,以及类加载器之间的隔离问题,以确保系统...
Java中的类加载器(ClassLoader)是Java虚拟机(JVM)的一个重要组成部分,它负责将类的.class文件从文件系统或者网络中加载到内存中,并转换为对应的Class对象。类加载器的工作流程主要包括加载、验证、准备、解析...
在Java编程语言中,ClassLoader是核心组件之一,它负责加载类到JVM(Java虚拟机)中执行。本文将深入探讨ClassLoader的工作原理和类加载机制,帮助开发者理解这个至关重要的概念。 1. 类加载机制概述 Java的类加载...
4. 自定义类加载器:通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,用户自定义 ClassLoader 可以根据用户的需要定制自己的类加载过程,在运行期进行指定类的动态实时加载。 ClassLoader 的层次结构...
总结来说,ClassLoader是Java运行时环境的重要组件,它按照委托模型加载类,提供了扩展和自定义的可能性。理解和掌握ClassLoader的工作原理以及如何自定义,对于提升Java应用的灵活性和安全性具有重要意义。
ClassLoader的工作流程包括查找、加载和验证。当一个类被请求加载时,ClassLoader首先检查该类是否已经被加载。如果未加载,它会根据类的全名(包括包名)来寻找对应的.class文件。这个过程通常涉及到从文件系统或...
在 Java 语言中,类加载器(ClassLoader)是 Java 运行时环境的核心组成部分之一,它负责将编译后的 `.class` 文件加载到 JVM 中执行。从 JDK 1.0 开始,随着 Java Applet 的出现以及网络应用的需求增加,类加载机制...
### Java ClassLoader与ClassPath详解 #### 一、概述 在Java编程中,类加载机制是十分关键的一个环节。类加载器(`ClassLoader`)负责将...理解这些概念有助于开发者更好地管理和控制程序中的类和资源的加载过程。
JVM 首先启动 bootstrap classloader,该 ClassLoader 加载 Java 核心 API,然后调用 ExtClassLoader 加载扩展 API,最后 AppClassLoader 加载 CLASSPATH 目录下定义的 Class,这就是一个程序最基本的加载流程。...
3. **Application ClassLoader** 的搜索路径由`System.getProperty("java.class.path")`指定,包含了应用程序类的路径。 #### 四、类加载器的特点与获取 ##### 4.1 特点 1. **类加载委托机制**: 每个类加载器在...
Java类加载过程分为三个阶段:加载、链接和初始化。`ClassLoader`在加载阶段发挥作用,它负责查找并加载类的字节码。在Java中,类加载器主要有三层:Bootstrap ClassLoader(引导类加载器)、Extension ClassLoader...
默认的`ClassLoader`无法加载内存中的`.class`,所以我们需要自定义一个`ClassLoader`,覆盖`findClass()`方法,从内存中读取`.class`字节码。 8. **创建并执行实例**: 使用`Class.forName()`加载类后,可以调用`...
在压缩包文件`javalauncher`中,可能包含了一个用于启动Java应用程序的自定义类加载器或者类加载辅助工具,帮助开发者更好地管理类的加载过程。这类工具通常会提供更方便的命令行参数,以便于指定类路径、加载特定的...
Java ClassLoader机制是Java运行时环境中的核心组件之一,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。理解ClassLoader的工作原理对于优化应用性能、处理类加载问题以及实现自定义加载器至关重要。 首先...