java 类加载机制总结

  Java程序的运行,离不开class的加载,所谓类加载就是将编译好的class文件加载的jvm并形成class对象,只有class正确加载才能被实例化和调用。

  

public class test {

    public static void main(String[] args) {
        System.out.println(new test().getClass().getClassLoader());
        System.out.println(new test().getClass().getClassLoader().getParent());
        System.out.println(new test().getClass().getClassLoader().getParent().getParent());

    }
}

  调用此方法会显示如下结果:

  [email protected]
  [email protected]
  null

  最后一个null是因为这个加载器是由c++方法实现的,所以在代码中获取不到这个类,除了这个有c++实现的类加载之外,其他的类加载器都有parent加载器,基本上呈树形结构,类加载的时候为了尽量保证calss所有的classloader只加载一次,加载时会先从appClassLoader加载,如果加载不到再从ExtClassLoader加载。从上到下,第一个加载类用于加载我们平常自己写的类和classPath中引入的jar,第二个加载类用于加载jdk中的一些扩展类,工具类等。第三个c++实现的加载类用于加载java规范定义的接口和实现,也就是在我们在path中配置的rt.jar文件

  在实际应用中我们也可以自定义自己的classLoader,主要继承classLoder这个类就可以,classLoder接口中有一些主要方法:

  loadClass ,此方法用来返回已经加载到jvm的class,如果没有则调用findClass加载,如果没有在整个加载过程中都没有加载上则会抛出classNotFoundException

  findClass,此方法用来加载class到jvm,如果自定义加载方式的话主要就是重写这个方法

  findSystemClass,此方法调用ExtClassLoader加载类,加载不到就继续调用c++实现的那个加载器来加载。

  dfineClass,此方法用于将二进制文件转化为class对象,也是类加载过程是十分重要的一个方法

   

  

时间: 2024-10-07 09:40:13

java 类加载机制总结的相关文章

Java类加载机制的深入研究

类加载机制 类加载是Java程序运行的首要步骤,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,同时让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 类加载过程 Java程序运行的场所是内存. 当在命令行执行java HelloWorld的时候,JVM会将HelloWorld.class加载到内存中,形成一个class对象:HelloWorld.class,具体过程如下: 1.找到jre目录,找到jvm.dll文件,并且初始化JVM 2.产生一个

深入理解和探究Java类加载机制-

深入理解和探究Java类加载机制---- 1.java.lang.ClassLoader类介绍 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个Java 类,即 java.lang.Class类的一个实例. ClassLoader提供了一系列的方法,比较重要的方法如: 2.JVM中类加载器的树状层次结构 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写

两道面试题,带你透彻解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Grandpa { static { System.out.println("爸爸在静态代码块"); } public static int factor = 25; public Father() { System.ou

用两道面试题带你详细了解 Java 类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{static{System.out.println("爷爷在静态代码块");}} class Father extends Grandpa{static{System.out.println("爸爸在静态代码块");}public static int factor = 25;public Father(){System.out.println("

一文读懂Java类加载机制

Java 类加载机制 Java 类加载机制详解. @pdai Java 类加载机制 类的生命周期 类的加载:查找并加载类的二进制数据 连接 验证:确保被加载的类的正确性 准备:为类的静态变量分配内存,并将其初始化为默认值 解析:把类中的符号引用转换为直接引用 初始化 使用 卸载 类加载器, JVM类加载机制 类加载器的层次 寻找类加载器 类的加载 JVM类加载机制 自定义类加载器 参考文章 类的生命周期 其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段.在这五个阶段中,加载.验证.准

透彻解析Java类加载机制

目录 Java类加载机制的七个阶段 加载.验证.准备(重要).解析.初始化(重要).使用.卸载 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Grandpa { static { System.out.println("爸爸在静态代码块"); } public sta

Java类加载机制与反射 jvm学习

同一个JVM的有线程.所有变量都处于同一个进程里,他们都使用JVM进程的内存区.当系统出现以下几种情况时JVM进程将被终止: 1.程序运行到最后正常结束 2.程序运行到使用System.exit()或Runtime.getRuntime().exit)代码处结束程序. 3.程序执行过程中遇到未捕获的异常或错误而结束. 4.程序所在平台强制结束了JVM进程 注意两次运行java程序,处于两个不同的JVM他们不共享内存. 类的加载 1.当程序主动使用某个类时,如果该类还未加载到内存中,则系统会通过加

深入研究Java类加载机制

类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 一.简单过程 Java程序运行的场所是内存,当在命令行下执行: java HelloWorld 命令的时候,JVM会将HelloWorld.class加载到内存中,并形成一个Class的对象HelloWorld.class. 其中的过程就是类加载过程: 1.寻找jre目录,寻找jvm.d

java类加载机制及方法调用

类加载机制 概述 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using)和卸载(Unloading)7个阶段.其中验证.准备.解析3个部分统称为连接(Linking) 于初始化阶段,虚拟机规范则是严格规定了有且只有5种情况必须立即对类进行"初始化"(而加载.验证.准备自然需要在此之前开始): 1

谈谈 Java 类加载机制

概述 类加载器主要分为两类,一类是 JDK 默认提供的,一类是用户自定义的. JDK 默认提供三种类加载器: Bootstrap ClassLoader 启动类加载器:每次执行 java 命令时都会使用该加载器为虚拟机加载核心类.该加载器是由 native code 实现,而不是 Java 代码,加载类的路径为 <JAVA_HOME>/jre/lib.特别的 <JAVA_HOME>/jre/lib/rt.jar 中包含了 sun.misc.Launcher 类, 而 sun.mis