一、类加载器是什么?
将class文件预先加载到jvm虚拟机机制。
二、JVM中存在以下三种类加载区
1、根加载器(BootStrap ,C++实现)
2、扩展加载器(Ext ,java实现)
3、系统类加载器(system,java实现)
分别有不同的作用域:
1、根加载器,加载jre之下类文件,如rt.jar出ext文件之外
2、扩展加载器,加载jre/ext之外的类文件
3、系统类加载器,加载App ClassPath指定路径下的类
三、类加载器加载模式
为了保持完整性及一致性,java的类加载机制采用了双亲委派模式进行类加载,
双亲委派模式只的是,在类加载的时候,预先使用指定加载器的父类加载器去加载class文件,当父加载器return空的时候,子加载器才进行加载
BootStrap为最高级别的加载器。
四、自定义类加载器
自定义的类加载器必须继承抽象类ClassLoader然后重写findClass方法,其实他内部还有一个loadClass方法和defineClass方法,另外两种不推荐使用,严重破坏双亲委派模型,
下面代码从网上抄下来的,一个自定义加载器的实现如下:
/**
* 一、ClassLoader加载类的顺序
* 1.调用 findLoadedClass(String) 来检查是否已经加载类。
* 2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
* 3.调用 findClass(String) 方法查找类。
* 二、实现自己的类加载器
* 1.获取类的class文件的字节数组
* 2.将字节数组转换为Class类的实例
* @author lei 2011-9-1
*/
public class ClassLoaderTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//新建一个类加载器
MyClassLoader cl = new MyClassLoader("myClassLoader");
//加载类,得到Class对象
Class<?> clazz = cl.loadClass("classloader.Animal");
//得到类的实例
Animal animal=(Animal) clazz.newInstance();
animal.say();
}
}
class Animal{
public void say(){
System.out.println("hello world!");
}
}
class MyClassLoader extends ClassLoader {
//类加载器的名称
private String name;
//类存放的路径
private String path = "E:\\workspace\\Algorithm\\src";
MyClassLoader(String name) {
this.name = name;
}
MyClassLoader(ClassLoader parent, String name) {
super(parent);
this.name = name;
}
/**
* 重写findClass方法
*/
@Override
public Class<?> findClass(String name) {
byte[] data = loadClassData(name);
return this.defineClass(name, data, 0, data.length);
}
public byte[] loadClassData(String name) {
try {
name = name.replace(".", "//");
FileInputStream is = new FileInputStream(new File(path + name + ".class"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while ((b = is.read()) != -1) {
baos.write(b);
}
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
上面主要记录的是java类加载器,下面记录下一个类的生命周期
类的生命周期为加载、链接(验证、准备、解析)、初始化、使用、卸载5个阶段
1、类加载,类加载就是上述所说的将类使用类加载器加载到虚拟机中
2、链接(验证、准备、解析)
验证:对装载到jvm的字节码进行验证
a、验证是否虚拟机可读字节码,验证魔数
b、验证字节码与jvm中所支持的版本是否正确,魔数后8个字节码
c、类中的方法等一些列存在是否合法,jvm对class文件的字节码有严格的规则要求
准备:准备阶段,为类中的静态变量分配内存,即放入jvm的方法区的常量池之中,需要注意的是,如果静态变量没有使用final修饰,放入方法区的值是初始值。我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。
解析:为准备阶段准备好的静态变量符号引用构建引用
3、初始化:初始化有以下4种方式
如果一个类被直接引用,就会触发类的初始化。在java中,直接引用的情况有:
通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。
通过反射方式执行以上三种行为。
初始化子类的时候,会触发父类的初始化。
作为程序入口直接运行时(也就是直接调用main方法)。
分享到:
相关推荐
在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...
它不仅管理类的生命周期,还确保了类的正确加载和初始化,是Java动态特性的基石。 #### 类加载器的工作原理 Java类加载器遵循按需加载原则,即只有当应用程序真正需要使用某个类时,类加载器才会去加载它。这一...
Java的类加载器是Java虚拟机(JVM)的核心组件之一,它负责将类的字节码文件从文件系统或网络中加载到JVM中,然后进行校验、解析和初始化,使得Java程序能够运行。类加载器的概念是Java动态加载和运行时类重定义的...
在Java中,类的生命周期是从类被加载、连接、初始化开始,直到类被卸载结束。 ##### 加载阶段 - **加载的目标** 加载阶段的最终目标是实现将编译后的`.class`文件中的二进制数据加载到JVM的运行时数据区的方法区...
类加载器负责将Java类加载到内存中,并对类进行验证、解析以及初始化等操作。 - **类加载器分类**: - **启动类加载器(Bootstrap ClassLoader)**:它是所有类加载器的父类,用于加载Java的核心库(如java.lang....
Java虚拟机JVM类加载初始化是Java程序运行过程中的关键环节,它负责将类的字节码文件加载到内存中并进行相应的处理,以便程序能够正确执行。在Java中,类加载器(Classloader)扮演着核心角色。下面将详细讨论类加载...
我们编写的“.java”扩展名的源代码文件中存储着要执行的程序逻辑,这些文件需要经过java编译器编译成“.class”...一个类的生命周期从类被加载、连接和初始化开始,只有在虚拟机内存中,我们的java程序才可以使用它。
Java中的类加载器分为三个主要层次:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(AppClassLoader)。启动类加载器负责加载JRE核心库,如`rt.jar`;扩展类加载器...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
Java 类加载器是Java虚拟机(JVM)的重要组成部分,它负责将类的.class文件从文件系统或网络中加载到内存中,并将其转换为运行时的类对象。类加载器的这种动态加载机制为Java提供了极高的灵活性,使得程序可以在运行...
类加载机制不仅涉及到类的加载、验证、准备、解析和初始化等步骤,还包括类加载时机的选择及类加载器的具体工作原理等内容。 #### 一、类加载时机 Java类的生命周期主要包括以下几个阶段:加载、验证、准备、解析...
类的加载、连接和初始化是这一过程中的关键步骤,通过类加载器实现了类的动态加载,增强了Java程序的灵活性和安全性。掌握这些基础知识不仅有助于编写更高效的代码,还能在解决实际问题时更加得心应手。
总之,通过Java的静态代码块和类加载器,我们可以有效地管理和加载资源文件,特别是属性配置文件,确保在程序启动时即完成初始化工作,提升应用性能。这种技术在大型复杂系统中尤其常见,因为它能够保证配置的正确性...
类加载器不仅涉及类的加载,还关系到类的可见性和生命周期管理。例如,不同类加载器加载的类之间默认是不可见的,除非有明确的导包声明。此外,类的卸载在Java中相对复杂,通常只有在以下情况才会发生:类的加载器被...
在“Java类重新加载101对象类和类加载器”的主题中,开发者还需要理解类加载的生命周期、类的可见性以及类加载器的层次结构。这些都是深入学习Java动态性的重要部分,也是提升开发技能和解决问题的关键。通过深入...
在这个过程中,类加载器(ClassLoader)扮演着关键角色,它负责查找并加载Java类的字节码文件。本文将深入探讨Java类加载的原理、过程以及相关知识点。 首先,我们需要理解类加载的三个基本阶段:加载、验证、准备...
该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...
本文将重点探讨类加载器的角色,以及类的加载、连接和初始化这三个阶段。 1. **类加载**: 类加载是JVM获取Java类字节码文件并将其转换为内存中`java.lang.Class`对象的过程。这个过程通常由类加载器完成。Java源...
Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...