// Java类加载机制示例代码
// 1. 类的加载过程:加载 -> 链接 -> 初始化
// 加载:通过类的全限定名获取该类的二进制字节流,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
// 链接:分为验证、准备、解析三个阶段。
// 验证:确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机安全。
// 准备:为类变量分配内存并设置类变量初始值(零值),此时不会为实例变量分配初始化,相关工作会在对象实例化时完成。
// 解析:将常量池内的符号引用替换为直接引用。
// 初始化:执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{})中的语句合并产生的。
// 2. 类加载器:引导类加载器(Bootstrap)、扩展类加载器(Extension)、应用程序类加载器(Application)
// 3. 双亲委派模型:当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,
// 每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器。只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,
// 子加载器才会尝试自己去加载。
// 示例代码展示类加载过程:
class ClassLoaderDemo {
static {
System.out.println("ClassLoaderDemo class is initialized.");
}
public static void main(String[] args) {
// 触发类加载
ClassLoader classLoader = ClassLoaderDemo.class.getClassLoader();
System.out.println("ClassLoader of ClassLoaderDemo: " + classLoader);
try {
// 加载指定类
Class<?> clazz = classLoader.loadClass("com.example.MyClass");
System.out.println("Loaded class: " + clazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
// 输出结果:
// ClassLoader of ClassLoaderDemo: sun.misc.Launcher$AppClassLoader@18b4aac2
// Loaded class: class com.example.MyClass
类加载过程:Java 类加载分为三个主要阶段:加载、链接和初始化。每个阶段都有特定的任务,确保类能够正确地在 JVM 中运行。
类加载器:Java 提供了三种主要的类加载器:引导类加载器、扩展类加载器和应用程序类加载器。它们负责加载不同层次的类。
双亲委派模型:这是 Java 类加载的一个重要特性,确保类加载的安全性和一致性。子类加载器会先委托父类加载器进行类加载,只有当父类加载器无法加载时,子类加载器才会尝试加载。
示例代码:展示了如何通过 ClassLoader 加载类,并打印出类加载器的信息。static 块用于演示类的初始化过程。
上一篇:java两个日期相减计算天数
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站