惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
J
Java Code Geeks
博客园 - 聂微东
B
Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
腾讯CDC
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
美团技术团队
博客园 - Franky
Google DeepMind News
Google DeepMind News
V
V2EX
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
The Cloudflare Blog

博客园 - wxf0701

Java之classpath Http之Get/Post请求区别 Java之细节 Java之Collection Framework 补码和原码的转化过程 Java之switch语句 Java关键字之native,strictfp,transient,volatile ORACLE大数据量下的分页解决方法 Java中堆与栈的区别 Servlet的生命周期 JSP的动作指令 Java二进制兼容性原理 Java源文件的编译、下载、解释和执行 61条面向对象设计的经验 面向对象的设计法则(4)——Liskov替换法则(LSP) 面向对象的设计法则(3)——开放-封闭法则(OCP) 面向对象的设计法则(2)——针对接口编程,而非(接口的)实现 面向对象的设计法则(1)——优先使用(对象)组合,而非(类)继承 抽象类和接口
Java之类加载机制
wxf0701 · 2008-08-14 · via 博客园 - wxf0701

java.lang包里有个ClassLoader类,ClassLoader 的基本目标是对类的请求提供服务,按需动态装载类和资源,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这个类并初始化。

一个Java应用程序可以使用不同类型的类加载器。例如Web Application Server中,Servlet的加载使用开发商自定义的类加载器, java.lang.String在使用JVM系统加载器,Bootstrap Class Loader,开发商定义的其他类则由AppClassLoader加载。在JVM里由类名和类加载器区别不同的Java类型。因此,JVM允许我们使用不同的加载器加载相同namespacejava类,而实际上这些相同namespacejava类可以是完全不同的类。这种机制可以保证JDK自带的java.lang.String是唯一的。

2. 加载类的两种方式:

(1)       隐式方式

使用new关键字让类加载器按需求载入所需的类

(2)       显式方式

java.lang.ClassforName()方法加载

public static Class forName(String className)

public static Class forName(String className, boolean initialize,ClassLoader loader)

参数说明:
        className - 所需类的完全限定名
        initialize - 是否必须初始化类(静态代码块的初始化)
        loader - 用于加载类的类加载器

调用只有一个参数的forName()方法等效于 Class.forName(className, true, loader)
这两个方法,最后都要连接到原生方法forName0(),其定义如下:
private static native Class forName0(String name, boolean initialize,ClassLoader loader) throws ClassNotFoundException;
只有一个参数的forName()方法,最后调用的是:
forName0(className, true, ClassLoader.getCallerClassLoader());
而三个参数的forName(),最后调用的是:
forName0(name, initialize, loader);
所以,不管使用的是new 來实例化某个类、或是使用只有一个参数的Class.forName()方法,内部都隐含了载入类 运行静态代码块的步骤。而使用具有三个参数的Class.forName()方法时,如果第二个参数为false,那么类加载器只会加载类,而不会初始化静态代码块,只有当实例化这个类的时候,静态代码块才会被初始化,静态代码块是在类第一次实例化的时候才初始化的。

直接使用类加载器

获得对象所属的类 : getClass()方法

获得该类的类加载器 : getClassLoader()方法

3.执行java XXX.class的过程

找到JRE——》找到jvm.dll——》启动JVM并进行初始化——》产生Bootstrap Loader——》载入ExtClassLoader——》载入AppClassLoader——》执行java XXX.class