首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java类加载机制

Java 类加载机制是指将类的字节码文件加载到 JVM(Java 虚拟机)内存中,并在内存中创建对应的 java.lang.Class 对象,从而使得类可以被 JVM 正确识别和使用。

基础概念

  1. 加载(Loading):通过类的全限定名获取定义此类的二进制字节流,并将其转换成方法区内的运行时数据结构,同时在内存中生成一个代表这个类的 Class 对象。
  2. 验证(Verification):确保被加载的类的正确性。
  3. 准备(Preparation):为类的静态变量分配内存并设置默认初始值。
  4. 解析(Resolution):将常量池内的符号引用替换为直接引用。
  5. 初始化(Initialization):执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。

优势

  1. 分离类的编译和运行,可以在不重新编译源代码的情况下,实现类的动态加载和替换。
  2. 实现代码的热部署和热更新。
  3. 增加程序的安全性,通过类加载器的隔离机制,可以防止非法访问和恶意代码的执行。

类型

  1. 启动类加载器(Bootstrap ClassLoader):加载 Java 核心 API,如 java.lang.Object 等。
  2. 扩展类加载器(Extension ClassLoader):加载 Java 扩展库。
  3. 应用程序类加载器(Application ClassLoader):加载应用程序的类路径(classpath)下的类。

应用场景

  1. 实现自定义的类加载器,满足特殊的类加载需求,如从数据库中加载类。
  2. 在框架中实现类的动态加载和卸载,如 Spring 框架的类加载机制。

常见问题及解决方法

  1. 类找不到(ClassNotFoundException):可能是类路径配置错误,或者类加载器的层次结构和委托机制导致无法找到指定的类。检查类路径设置,确保类的正确加载顺序。
  2. 类冲突:不同的类加载器加载同一个类,导致类型不匹配。统一类加载器的使用,避免重复加载。
  3. 类初始化问题:静态变量的初始化顺序错误或静态代码块中的异常。仔细检查静态变量和静态代码块的逻辑。

以下是一个简单的自定义类加载器示例代码:

代码语言:txt
复制
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class MyClassLoader extends ClassLoader {
    private String classPath;

    public MyClassLoader(String classPath) {
        this.classPath = classPath;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] classData = loadClassData(name);
        if (classData == null) {
            throw new ClassNotFoundException();
        } else {
            return defineClass(name, classData, 0, classData.length);
        }
    }

    private byte[] loadClassData(String className) {
        String fileName = classPath + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
        try (FileInputStream fis = new FileInputStream(fileName);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            int len;
            byte[] buffer = new byte[1024];
            while ((len = fis.read(buffer))!= -1) {
                baos.write(buffer, 0, len);
            }
            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        MyClassLoader myClassLoader = new MyClassLoader("path/to/classes");
        Class<?> clazz = myClassLoader.loadClass("com.example.MyClass");
        System.out.println(clazz.getName());
    }
}

在上述示例中,自定义类加载器从指定的路径加载类的字节码数据,并定义成 Class 对象。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java类加载机制

Java类加载机制是指 JVM 把类的字节码文件加载到内存,并进行链接和初始化的过程。...加载加载是“类加载”(Class Loading)过程的一个阶段,是通过双亲委派机制进行类的加载。...类加载器把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码模块称为“类加载器”。...对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。类加载器可分为启动类加载器、扩展类加载器和应用类加载器。...,或者被 java.ext.dirs 系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

9210

Java类加载机制

类加载器及加载机制 java.lang.Object |__java.lang.ClassLoader 类加载器负责将class文件读入内存并为之生成对应的java.lang.Class...3.1 类加载机制 ?...层级关系 Java类加载机制主要有以下三种: 双亲委派模型:如果一个类加载器收到了加载类的请求,它会先把请求委托给父类加载器去完成,依次递归,一直到最顶层的启动类加载器;只有在父类加载器无法完成类的加载工作时...缓存机制:缓存机制会保证所有加载过的Class都会被缓存,当程序中需要使用某个类时,类加载器先从缓冲区搜索该类,若搜寻不到将读取该类的二进制数据并转换成Class对象存入缓冲区中。...JDK 9中的类加载机制有所改变。三个内置的类加载器一起协作来加载类。 JDK 9中的类加载机制有所改变。三个内置的类加载器一起协作来加载类。 JDK 9中的类加载机制有所改变。

1.1K30
  • Java类加载机制

    Java的程序要运行需要将编译好的class文件加载到JVM运行时数据区。 ? 在了解类的加载机制之前,我们需要了解一下类的生命周期。...类加载器 Java类的加载需要用到类加载器。类加载器负责装入类,搜索网络,jar,zip,文件夹,二进制数据,内存等指定位置的资源。...一个Java程序运行,至少有3个不同的类加载器实例,负责加载不同的类。...通过JDK提供的API:java.lang.Class.getClassLoader() 可以进行类加载器的查看,该API会返回装载类的类加载器,如果这个类是由Bootstrap ClassLoader...双亲委派模型 Java中的类并不会重复加载,同一类加载器,同一类名,代表的是同一个类。而避免类重复加载的主要原因在于JVM在加载类时默认采用的是双亲委派模型。

    58710

    Java类加载机制

    这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情 类加载机制 JVM的类加载机制主要有3种,全盘负责/双亲委派/缓存机制。...缓存机制 缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据...双亲委派 双亲委派机制的优势:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader...假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的...java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

    10610

    Java类加载机制

    各个步骤的主要工作如下: 加载:一个规则,就是需要把.java文件如何变成.class文件。...这个规则就是在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区访问这些数据的访问入口。 验证:验证字节流是否符合Class文件格式的规范。...答:当某个类加载器在接到加载类的请求时,会将加载任务委托给父类加载器,依次递归,父类加载器可以完成类加载任务,就成功返回;不能加载则子类加载器自己完成加载。...有3类加载器: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用程序类加载器(Application ClassLoader...意义:双亲委派避免类的重复加载问题,以及避免Java核心的API被篡改,保证了代码安全。

    67131

    Java类加载机制

    并不是继承自java.lang.ClassLoader,它没有父类加载器它加载扩展类加载器和应用程序类加载器,并成为他们的父类加载器出于安全考虑,启动类只加载包名为:java、javax、sun开头的类第二个...,如果子类加载失败就会抛出ClassNotFoundException异常,这就是双亲委派模式第三方包加载方式:反向委派机制在Java应用中存在着很多服务提供者接口(Service Provider Interface...这样可以保证对 Java 核心源代码的保护,这就是沙箱安全机制。3 破坏双亲委派机制的场景既然Java中引入了双亲委派机制,为什么要破坏它呢?答:因为它有一些缺点。...下面给大家列举一下,破坏双亲委派机制最常见的场景。3.1 JNDIJNDI是Java中的标准服务,它的代码由启动类加载器去加载。...有了线程上下文加载器,JNDI服务就可以使用它去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载的动作,这样就打破了双亲委派机制。

    8600

    java类加载器加载机制

    在沙箱组件中包括类装载器结构,类加载器体系结构也是java沙箱的第一道防线,因为程序都是通过类加载器才能够加载到JVM中的。   类加载器有三方面的作用: 1. 它防止了恶意代码去干涉善意代码 2....其中一个大家所熟悉的词就是“双亲委派机制”,所谓“双亲委派机制”,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时... 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。... 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。...关于java类加载机制推荐大家看这篇文章《深入探讨 Java 类加载器》,IBM文档,写的很详细。

    1K10

    java类的加载机制

    类加载:将类的.class文件中的二进制数据读入到内存中,生成java.lang.Class对象。Class对象用来封装方法区内的数据结构。JVM规范允许类加载器预先加载类。...也就是说,在JAVA中的同一个类,如果用不同的类加载器加载,则生成的class对象认为是不同的。...,主要加载JAVA_HOME/lib/ext目录中的类库。...其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API...该类并不存在java.lang中,经过双亲委托模式,传递到启动类加载器中,由于父类加载器路径下并没有该类,所以不会加载,将反向委托给子类加载器加载,最终会通过系统类加载器加载该类。

    41020

    Java的类加载机制

    该类加载器在此目录里面查找并加载 Java 类。 (jar包用) 系统类加载器(system class loader): 它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。...上述类加载器是逐级继承的 双亲委派机制 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托交给父类加载器,父类加载器又将加载任务向上委托,直到最父类加载器,如果最父类加载器可以完成类加载任务,就成功返回...简单来说:双亲委派机制:能被父类加载器处理的,不会交给子类加载器去处理的。...双亲委派机制的好处:   保证java核心库的安全性(例如:如果用户自己写了一个java.lang.String类就会因为双亲委派机制不能被加载,不会破坏原生的String类的加载) 代理模式   ...与双亲委派机制相反,代理模式是先自己尝试加载,如果无法加载则向上传递。

    21920

    简述Java类加载机制

    类加载本质 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行验证、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是Java虚拟机的类加载机制。...SPI机制与JDBC驱动类加载 我们都知道Java的SPI机制是一种JDK内置的服务提供发现机制,比如java.sql.Driver接口,可以由不同的数据库厂商实现此接口,来提供具体数据库的驱动,并且需要按照...SPI机制实现类的问题。...Dubbo类加载 Dubbo也是基于SPI机制实现的架构,JDK默认的SPI机制类加载器ServiceLoader,会在META-INF/services下获取接口的所有实现类,虽然也提供了延迟加载,但也基本只能通过遍历全部获取...OSGI类加载 OSGI是Java模块化标准,而OSGI实现模块化热部署的关键则是它自定义的类加载器机制的实现,每个程序模块(OSGI中称为Bundle)都有一个自己的类加载器,当需要更换一个Bundle

    1.9K40

    java类的加载机制

    ,有很多其他的虚拟机是用Java语言实现的),是虚拟机自身的一部分;所有其它的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类 java.lang.ClassLoader...JVM类加载机制 全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入 父类委托,先让父类加载器试图加载该类...,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类 缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在...双亲委派机制: 1、当 AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。...否则,由于双亲委托机制的存在,会直接导致该类由 AppClassLoader加载,而不会通过我们自定义类加载器来加载。

    60931

    Java类加载机制详解

    1.概述 Java类加载器负责加载所有的类,系统会为所有被载入内存的类生成一个java.lang.Class实例。对于同一个类,一旦被加载如内存中,就不会被再次加载。...Bootstrap CLassLoader:根类加载器,也称为引导类加载器,负责加载Java的核心类,如JRE目标下的tr.jar、charsets.jar等。...默认情况下,Java程序使用Application ClassLoader加载一个类。...3.类加载机制 JVM采用如下三种类加载机制: 全盘委托:当一个类加载器负责加载某个类时,该类所依赖和引用的其他类也将由该类加载器负责加载,除非显式指定另一个类加载器。...父类委托:加载一个类时,首先会让其父类加载器进行加载,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载。这一机制可以保证类加载的安全性。

    61530

    Java类加载原理机制

    3.类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的Java.lang.Class对象,用来封装类在方法区类的对象。...看下面2图 类的加载的最终产品是位于堆区中的Class对象         Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口 加载类的方式有以下几种...(服务器) 4.加载器 JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述: 1)Bootstrap ClassLoader 负责加载$JAVA_HOME...中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类 2)Extension ClassLoader 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME...而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。 5.委派机制 VM在加载类时默认采用的是双亲委派机制。

    1.5K100

    Java 类加载机制详解

    类加载机制是 Java 语言的一大亮点,使得 Java 类可以被动态加载到 Java 虚拟机中。 这次我们抛开术语和概念,从例子入手,由浅入深地讲解 Java 的类加载机制。...本文涉及知识点:双亲委托机制、BootstrapClassLoader、ExtClassLoader、AppClassLoader、自定义网络类加载器等 文章涉及代码: https://github.com.../wingjay/HelloJava/blob/master/common/src/classloader/HelloClassLoader.java 什么是 Java 类加载机制?...Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器会读取这个 .class 文件,并转换成...这些类是 Java 运行的基础类,由一个名为 BootstrapClassLoader 加载器负责加载,它也被称作 根加载器/引导加载器。

    73240

    Java类加载机制复习

    简介 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。...类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每个这样的实例用来表示一个 Java 类。...类加载器的树状组织结构 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。...扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。...系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。

    27420

    Java 类加载机制详解

    类加载机制是 Java 语言的一大亮点,使得 Java 类可以被动态加载到 Java 虚拟机中。 这次我们抛开术语和概念,从例子入手,由浅入深地讲解 Java 的类加载机制。...本文涉及知识点:双亲委托机制、BootstrapClassLoader、ExtClassLoader、AppClassLoader、自定义网络类加载器等 文章涉及代码: https://github.com.../wingjay/HelloJava/blob/master/common/src/classloader/HelloClassLoader.java 什么是 Java 类加载机制?...从源码角度真正理解双亲委托加载机制 上面已经通过一些例子了解了双亲委托的一些特性了,下面来看一下它的实现代码,加深理解。...本文力求通过简单的语言和合适的例子来讲解其中双亲委托机制、自定义加载器等,并开发了自定义的NetworkClassLoader。

    51610

    Java 类加载机制详解

    我们可以利用类加载器,实现类的动态加载。 二、类的加载机制   在Java中,采用双亲委派机制来实现类的加载。那什么是双亲委派机制?...另外两种是 Java 语言自身实现的类加载器,包括扩展类加载器(ExtClassLoader)和应用类加载器(AppClassLoader),扩展类加载器负责加载Java_Runtime_Home>\...究其缘由,启动类加载器属于 JVM 的一部分,它不是由 Java 语言实现的,在 Java 中无法直接引用,所以才返回空。...否则,由于双亲委托机制的存在,会直接导致该类由 AppClassLoader 加载,而不会通过我们自定义类加载器来加载。 四、总结   双亲委派机制能很好地解决类加载的统一性问题。...双亲委派机制则保证了基类都由相同的类加载器加载,这样就避免了同一个字节码文件被多次加载生成不同的 Class 对象的问题。但双亲委派机制仅仅是Java 规范所推荐的一种实现方式,它并不是强制性的要求。

    25010

    类加载与 Java主类加载机制解析

    小编说:类的加载机制与生命周期等概念,在各种书籍与各种网络博客里随处可见,然而对于一个想要真正了解其内部实现的人而言,那些都涉入过浅。本文从JVM源码的角度,还原出Java类加载的真实机制。...Java主类加载机制 到上一节为止,Java类加载的过程终于全部讲完了。在前面章节详细讲解了常量池解析、字段解析、方法解析、instanceKlass创建及镜像类的创建。...以上便是一个Java类加载的核心流程。了解了类加载的核心流程之后,也许聪明的你会忍不住想,Java类的加载到底何时才会被触发呢?...Java主类的加载由JVM自动触发——JVM执行完自身的若干初始化逻辑之后,第一个加载的便是Java程序的主类。总体上而言,Java主类加载的链路如下: ?...这里不得不提一句,JVM作为一款虚拟机,其本身由C/C++语言写成,但是JVM是为执行Java字节码文件而生的,因此JVM内部必然有一套机制能够从C/C++程序调用Java类中的方法,这套机制便通过JavaCalls

    94110

    Java 类机制(2)---- 类加载过程

    "C:\Users\MAIBENBEN\Desktop\blog\Java常用技术\Java 类机制(2)----类加载过程" Main 命令。...\Desktop\blog\Java常用技术\Java 类机制(2)----类加载过程"。...双亲委派模型 双亲委派模型是 Java 虚拟机默认的类加载机制,也是其推荐的类加载机制,其流程如下:当某个类加载器要加载某个类时,先判断该类有没有被当前类加载器加载过,如果加载过,则直接返回对应 Class...既然 Java 已经提供给我们加载某个特定路径下的类的类加载器。...好了,这篇文章中我们详细看了一下关于 JVM中类加载的机制,下一篇文章我们将一起研究一下 class 文件的格式,届时会再度回顾这篇文章的某些内容。

    65720

    Java类加载机制与Tomcat类加载器架构

    Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类...有了这一前提,我们需要通过自定义类加载器绕过双亲委派机制,实现自定义类的加载。...为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。 Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制。...OSGi已经成为了业界“事实上”的Java模块化标准,而OSGi实现模块化热部署的关键则是它自定义的类加载器机制的实现。...分析:如果按主流的双亲委派机制,显然无法做到让父类加载器加载的类去访问子类加载器加载的类,上面在类加载器一节中提到过通过线程上下文方式传播类加载器。

    38530
    领券