黑马程序员___java类加载器

----------- android培训、java培训、java学习型技术博客、期待与您交流! ---------

 

类加载器基本概念

 

顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。

 

基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例。下面详细介绍这个 Java 类。

 

java.lang.ClassLoader类介绍

 

java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例。

ClassLoader提供了一系列的方法,比较重要的方法如:

 

 

方法说明
getParent()返回该类加载器的父类加载器。
loadClass(String name)加载名称为 name的类,返回的结果是 java.lang.Class类的实例。
findClass(String name)查找名称为 name的类,返回的结果是 java.lang.Class类的实例。
findLoadedClass(String name)查找名称为 name的已经被加载过的类,返回的结果是 java.lang.Class类的实例。
defineClass(String name, byte[] b, int off, int len)把字节数组 b中的内容转换成 Java 类,返回的结果是 java.lang.Class类的实例。这个方法被声明为 final的。
resolveClass(Class<?> c)链接指定的 Java 类。

 

 

 

类加载器的树状组织结构

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:

  • 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自java.lang.ClassLoader。
  • 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  • 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。

除了引导类加载器之外,所有的类加载器都有一个父类加载器。通过 上面表中给出的 getParent()方法可以得到。对于系统提供的类加载器来说,系统类加载器的父类加载器是扩展类加载器,而扩展类加载器的父类加载器是引导类加载器;对于开发人员编写的类加载器来说,其父类加载器是加载此类加载器 Java 类的类加载器。因为类加载器 Java 类如同其它的 Java 类一样,也是要由类加载器来加载的。一般来说,开发人员编写的类加载器的父类加载器是系统类加载器。类加载器通过这种方式组织起来,形成树状结构。树的根节点就是引导类加载器。下图中给出了一个典型的类加载器树状组织结构示意图,其中的箭头指向的是父类加载器。


 类加载器树状组织结构示意图
类加载器树状组织结构示意图 

下面代码演示了类加载器的树状组织结构。


清单 1. 演示类加载器的树状组织结构
  1. public class ClassLoaderTree { 
  2.     public static void main(String[] args) { 
  3.         ClassLoader loader = ClassLoaderTree.class.getClassLoader(); 
  4.         while (loader != null) { 
  5.             System.out.println(loader.toString()); 
  6.             loader = loader.getParent(); 
  7.         } 
  8.     } 
  9.  }

输出:

  1. sun.misc.Launcher$AppClassLoader@9304b1 
  2. sun.misc.Launcher$ExtClassLoader@190d11

类加载器的代理模式

类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。比如一个 Java 类 com.example.Sample,编译之后生成了字节代码文件Sample.class。两个不同的类加载器 ClassLoaderA和 ClassLoaderB分别读取了这个 Sample.class文件,并定义出两个java.lang.Class类的实例来表示这个类。这两个实例是不相同的。对于 Java 虚拟机来说,它们是不同的类。试图对这两个类的对象进行相互赋值,会抛出运行时异常 ClassCastException。下面通过示例来具体说明。下列代码中给出了 Java 类com.example.Sample。


清单 3. com.example.Sample 类
  1. package com.example; 
  2.  public class Sample { 
  3.     private Sample instance; 
  4.     public void setSample(Object instance) { 
  5.         this.instance = (Sample) instance; 
  6.     } 
  7.  }

com.example.Sample类的方法 setSample接受一个 java.lang.Object类型的参数,并且会把该参数强制转换成com.example.Sample类型。测试 Java 类是否相同的代码如 下面代码所示。


清单 4. 测试 Java 类是否相同
  1. public void testClassIdentity() { 
  2.     String classDataRootPath = "C:\\workspace\\Classloader\\classData"; 
  3.     FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath); 
  4.     FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath); 
  5.     String className = "com.example.Sample";     
  6.     try { 
  7.         Class<?> class1 = fscl1.loadClass(className); 
  8.         Object obj1 = class1.newInstance(); 
  9.         Class<?> class2 = fscl2.loadClass(className); 
  10.         Object obj2 = class2.newInstance(); 
  11.         Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class); 
  12.         setSampleMethod.invoke(obj1, obj2); 
  13.     } catch (Exception e) { 
  14.         e.printStackTrace(); 
  15.     } 
  16.  }

上面代码使用了类 FileSystemClassLoader的两个不同实例来分别加载类 com.example.Sample,得到了两个不同的java.lang.Class的实例,接着通过 newInstance()方法分别生成了两个类的对象 obj1和 obj2,最后通过 Java 的反射 API 在对象obj1上调用方法 setSample,试图把对象 obj2赋值给 obj1内部的 instance对象。运行结果如下所示。


清单 5. 测试 Java 类是否相同的运行结果
  1. java.lang.reflect.InvocationTargetException 
  2. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
  3. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
  4. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  5. at java.lang.reflect.Method.invoke(Method.java:597) 
  6. at classloader.ClassIdentity.testClassIdentity(ClassIdentity.java:26) 
  7. at classloader.ClassIdentity.main(ClassIdentity.java:9) 
  8. Caused by: java.lang.ClassCastException: com.example.Sample 
  9. cannot be cast to com.example.Sample 
  10. at com.example.Sample.setSample(Sample.java:7) 
  11. ... 6 more

从给出的运行结果可以看到,运行时抛出了 java.lang.ClassCastException异常。虽然两个对象 obj1和 obj2的类的名字相同,但是这两个类是由不同的类加载器实例来加载的,因此不被 Java 虚拟机认为是相同的。

了解了这一点之后,就可以理解代理模式的设计动机了。代理模式是为了保证 Java 核心库的类型安全。所有 Java 应用都至少需要引用 java.lang.Object类,也就是说在运行的时候,java.lang.Object这个类需要被加载到 Java 虚拟机中。如果这个加载过程由 Java 应用自己的类加载器来完成的话,很可能就存在多个版本的 java.lang.Object类,而且这些类之间是不兼容的。通过代理模式,对于 Java 核心库的类的加载工作由引导类加载器来统一完成,保证了 Java 应用所使用的都是同一个版本的 Java 核心库的类,是互相兼容的。

不同的类加载器为相同名称的类创建了额外的名称空间。相同名称的类可以并存在 Java 虚拟机中,只需要用不同的类加载器来加载它们即可。不同类加载器加载的类之间是不兼容的,这就相当于在 Java 虚拟机内部创建了一个个相互隔离的 Java 类空间。这种技术在许多框架中都被用到,后面会详细介绍。

下面具体介绍类加载器加载类的详细过程。

加载类的过程

在前面介绍类加载器的代理模式的时候,提到过类加载器会首先代理给其它类加载器来尝试加载某个类。这就意味着真正完成类的加载工作的类加载器和启动这个加载过程的类加载器,有可能不是同一个。真正完成类的加载工作是通过调用 defineClass来实现的;而启动类的加载过程是通过调用 loadClass来实现的。前者称为一个类的定义加载器(defining loader),后者称为初始加载器(initiating loader)。在 Java 虚拟机判断两个类是否相同的时候,使用的是类的定义加载器。也就是说,哪个类加载器启动类的加载过程并不重要,重要的是最终定义这个类的加载器。两种类加载器的关联之处在于:一个类的定义加载器是它引用的其它类的初始加载器。如类 com.example.Outer引用了类 com.example.Inner,则由类 com.example.Outer的定义加载器负责启动类com.example.Inner的加载过程。

方法 loadClass()抛出的是 java.lang.ClassNotFoundException异常;方法 defineClass()抛出的是java.lang.NoClassDefFoundError异常。

类加载器在成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。也就是说,对于一个类加载器实例来说,相同全名的类只加载一次,即 loadClass方法不会被重复调用。

 

Class.forName

Class.forName是一个静态方法,同样可以用来加载类。该方法有两种形式:Class.forName(String name, boolean initialize, ClassLoader loader)和 Class.forName(String className)。第一种形式的参数 name表示的是类的全名;initialize表示是否初始化类;loader表示加载时使用的类加载器。第二种形式则相当于设置了参数 initialize的值为 true,loader的值为当前类的类加载器。Class.forName的一个很常见的用法是在加载数据库驱动的时候。如Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance()用来加载 Apache Derby 数据库的驱动。

 

开发自己的类加载器

虽然在绝大多数情况下,系统默认提供的类加载器实现已经可以满足需求。但是在某些情况下,您还是需要为应用开发出自己的类加载器。比如您的应用通过网络来传输 Java 类的字节代码,为了保证安全性,这些字节代码经过了加密处理。这个时候您就需要自己的类加载器来从某个网络地址上读取加密后的字节代码,接着进行解密和验证,最后定义出要在 Java 虚拟机中运行的类来。下面将通过两个具体的实例来说明类加载器的开发。

文件系统类加载器

第一个类加载器用来加载存储在文件系统上的 Java 字节代码。完整的实现如下

 

  1. public class FileSystemClassLoader extends ClassLoader { 
  2.     private String rootDir; 
  3.     public FileSystemClassLoader(String rootDir) { 
  4.         this.rootDir = rootDir; 
  5.     } 
  6.     protected Class<?> findClass(String name) throws ClassNotFoundException { 
  7.         byte[] classData = getClassData(name); 
  8.         if (classData == null) { 
  9.             throw new ClassNotFoundException(); 
  10.         } 
  11.         else { 
  12.             return defineClass(name, classData, 0, classData.length); 
  13.         } 
  14.     } 
  15.     private byte[] getClassData(String className) { 
  16.         String path = classNameToPath(className); 
  17.         try { 
  18.             InputStream ins = new FileInputStream(path); 
  19.             ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  20.             int bufferSize = 4096; 
  21.             byte[] buffer = new byte[bufferSize]; 
  22.             int bytesNumRead = 0; 
  23.             while ((bytesNumRead = ins.read(buffer)) != -1) { 
  24.                 baos.write(buffer, 0, bytesNumRead); 
  25.             } 
  26.             return baos.toByteArray(); 
  27.         } catch (IOException e) { 
  28.             e.printStackTrace(); 
  29.         } 
  30.         return null; 
  31.     } 
  32.     private String classNameToPath(String className) { 
  33.         return rootDir + File.separatorChar 
  34.                 + className.replace('.', File.separatorChar) + ".class"; 
  35.     } 
  36.  }
所示。

如上所示,类 FileSystemClassLoader继承自类 java.lang.ClassLoader。在 表 1中列出的 java.lang.ClassLoader类的常用方法中,一般来说,自己开发的类加载器只需要覆写 findClass(String name)方法即可。java.lang.ClassLoader类的方法loadClass()封装了前面提到的代理模式的实现。该方法会首先调用 findLoadedClass()方法来检查该类是否已经被加载过;如果没有加载过的话,会调用父类加载器的 loadClass()方法来尝试加载该类;如果父类加载器无法加载该类的话,就调用 findClass()方法来查找该类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass()方法,而是覆写findClass()方法。

类 FileSystemClassLoader的 findClass()方法首先根据类的全名在硬盘上查找类的字节代码文件(.class 文件),然后读取该文件内容,最后通过 defineClass()方法来把这些字节代码转换成 java.lang.Class类的实例。

 

----------- android培训、java培训、java学习型技术博客、期待与您交流! ---------

转载于:https://www.cnblogs.com/miaozy/p/3759393.html

【RT-DETR涨点改进】小目标检测、特征融合改进篇 | TGRS 2024 | RT-DETR引入CSFM上下文选择融合模块,适合多模态检测、红外小目标检测、小目标检测、遥感目标检测等任务有效涨点 本文提出了一种改进RT-DETR目标检测模型的方法,通过引入上下文选择融合模块(CSFM)显著提升复杂背景下小目标和低对比度目标的检测精度。CSFM模块采用多尺度特征融合和动态特征选择机制,有效增强模型的全局上下文感知能力,同时保留细节特征。该模块通过通道减少机制和空间信息调节,实现从粗到细的特征聚合,减少误报并提高轮廓检测精度。实验表明,改进后的RT-DETR模型在多个基准测试中表现优异,计算效率与检测精度均优于现有方法。文章还详细介绍了模块配置和yaml文件修改方法,为模型部署提供指导。 阅读详情

相关推荐

晶圆测试(wafer sort)全流程解析:从探针卡到良率统计的实战指南

本文详细解析了晶圆测试(wafer sort)的全流程,从探针卡选型到良率统计的实战指南。涵盖了12英寸先进制程产线的关键技术,包括探针卡系统、测试程序开发、产线自动化集成及数据分析,特别聚焦多站点并行测试的时序优化和接触阻抗异常排查,帮助工程师提升测试效率与准确性。

weixin_29279153的博客 731

java虚拟机如何判断两个类相同,JVM虚拟机如何判断对象存活&GC算法介绍

一、前言JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区/元信息区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而Java堆区和方法区则不一样、不一样!(怎么不一样说的朗朗上口),这部分内存的分配和回收是动态的,正是垃圾收集...

weixin_33362939的博客 255

FPGA音频处理入门:手把手教你用Verilog实现I2S接收模块(附完整代码)

本文详细介绍了如何使用Verilog在FPGA上实现I2S接收模块,涵盖I2S协议原理、Verilog架构设计、完整代码实现及优化技巧。通过实战案例,帮助开发者快速掌握数字音频处理技术,适用于嵌入式音频系统开发。

weixin_30335575的博客 417

JVM初识1

类的加载过程: 加载==> 链接 [[验证==>准备==>解析]==>初始化 加载: 1.通过一个类的全限定名,获取定义此类的二进制字节流 2.将这个字节流所代表的静态存储结构转化为方法的运行时的数据结构 3.在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口 加载类的方式: 1.从本地系统直接加载 2.运行时计算生成:使用最多的是动态代理技术 3.从专有的数据库中提取.class文件(比较少见) 4.从加密文件中获取,防止Class

m0_47460678的博客 214

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

智警杯1.4---excel可视化

知识点

lulu001128的博客 949

JVM - 判断是否是同一个类的标准

目录判断是否是同一个类的标准 判断是否是同一个类的标准 在JVM中表示两个class对象是否为同一个类的两个必要条件: 类的完整类名必须一致,包括包名。 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。 换句话说,在JVM中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个对象也不是相等的。 ...

个人纪录、总结! 817

RT-Thread 5.1.0 实战:手把手教你用CubeMX和RT-Studio创建第一个工程(附常见编译错误修复)

本文详细介绍了如何使用STM32CubeMX和RT-Thread Studio 5.1.0创建第一个RT-Thread工程,包括开发环境准备、CubeMX配置、工程整合及常见编译错误修复。通过实战指南,帮助开发者快速上手RT-Thread 5.1.0,解决开发过程中的典型问题,提升嵌入式开发效率。

weixin_29165465的博客 285

JVM如何判断类相同

上篇博客中,提到Class生成对象的原理,根据上篇博客的小例子,得出的结果程序中的Class对象是一样的,是只有一个Class对象.那JVM是如何判断这三个Class对象其实是一个Class对象呢? JVM根据两个方面判断:一是类的全称;另一个是类加载器. 根据上篇博客中的结果得出:类的全称是相同的.那类加载器是否相同呢?即使类的全称相同,而使用的加载器不同,那Class对象也是不同的.那...

java开发指南博客 【转载】 575

【CanMV K210】AI 视觉 MNIST 手写数字识别与分类推理

本文介绍了基于CanMV K210开发板的MNIST手写数字识别实验。实验通过摄像头采集图像,经过开窗、灰度化、缩放、反色等预处理后,使用KPU神经网络加速器运行MNIST分类模型,最终在LCD上显示识别结果。重点讲解了分类模型与检测模型的区别、图像预处理流程以及KPU推理结果的解析方法。实验帮助理解从图像采集到分类输出的完整AI视觉处理链路,并提供了调试思路和硬件连接说明。

Mr数据杨 364

视图库对接系列(GA-T 1400)一、简单介绍

GA/T 1400《公安视频图像信息应用系统》 是我们需要参考看看的相关文档,里面有对应的标准和介绍,没有这个文档的话可以加群找我要。群的话 我放在最下面了。我们先简单想几个问题, 也就是这个协议主要干什么用的,为什么要有, 能做什么。

qq_37716298的博客 4283

类加载器与类全名才能确立其在JVM中的唯一性

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33970449的博客 368

YOLOv11改进 | Neck篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov11(全网独家创新)

本文给大家带来的最新改进是利用分层特征融合块HFFB创新yolov11的neck部分我称之为HFPN,这个模块可以融合局部特征、全局特征、中间特征将三种特征融合在一起辅助yolov11进行检测,经过我的设计分为三种可以针对大目标、小目标、标准目标的检测方式均不同,大家可以根据自己的数据集进行不同的选择,本文的内容为我独家创新。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、原理介绍三、核心代码四、添加方法4.1 修改一4.2 修改二4.3 修改三4.4 修改四。

Snu77的博客 5207

黑马程序员_Java 类加载器

-------http://www.itheima.com/"">android培训、<a href="http://www.itheima.com/" ">java培训期待与您交流!----------   Java 类加载器   类加载器是将Java的class字节码文件从硬盘加载到内存里的一个工具(基本全是Java程序)。 JVM中安装了多个类加载器。默认情况下提供三个类

javamu的专栏 710

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

黑马程序员—JAVA类加载器

------------- android培训、java培训、期待与您交流!------------- 类加载器: 简要介绍什么是类加载器和类加载器的作用: Ø  Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader Ø  类加载器也是Java类,因为其他是java类的

zxhhui1987的专栏 391

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

黑马程序员——java的类加载器

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-类加载器的作用 当我们编写出java文件时就有,经过java编译器的编写之后转回成class文件,当我们用到某一class类时,就要把该类的字节码加载进内存才可以用,而这一加载的过程就要通过类加载器完成,也就是说java类通过类加载器加载进内存。类加载器的结构 Java 中的类加载器大致可以分成两类,一类是系

guojiadui的博客 376

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

黑马程序员_java类加载器

类加载器 Java虚拟机与程序的生命周期 在如下几种情况下,java虚拟机将结束生命周期 1.      执行了System.exit()方法\ 2.      程序正常执行结束 3.      程序在执行过程中遇到了异常或错误而异常终止 4.      由于操作系统出现错误而导致java虚拟机进程终止 类的加载,连接与初始化 加载:查找并加载类的二进制数据 连接:

zhengylsc的专栏 826

黑马程序员——Java中的类加载器

------- android培训、java培训、期待与您交流! -------- 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类: BootStrap      ExtClassLoader     AppClassLoader   类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中,类加载

InsistOwn的博客 664

黑马程序员-java-类加载器

---------------------- android培训、java培训、期待与您交流! ----------------------   我们程序写完会编译生成一个.class文件,java虚拟机运行我们的程序 就是调用类加载器,把硬盘上类的.class字节码(二进制)文件读到内存,放在内存的方法区, 然后在堆内存生成该类的一个Class对象,然后就生成各个类的实例运行了。 类加载

dacheng2009的专栏 435

黑马程序员_JAVA_类加载器

类加载器:用来加载类的工具。 Java虚拟机中可以安装多个类加载器, 系统默认三个主要类加载器,每个类负责加载特定位置的类: BootStrap, ExtClassLoader,AppClassLoader 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,既然这样第一个类加载器又是谁加载的呢? 显然必须有第一个类加载器不是不

axuan2014的专栏 602

【黑马程序员】java基础加强_类加载器

------- android培训、java培训、期待与您交流! ----------

BuXingDeYouShou的专栏 585

黑马程序员——Java基础---类加载器

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------                                                                                                      黑马程序员——Java基础---类加载器 一、概述  类加载器Java虚拟机中可以安装

601

黑马程序员 java学习笔记——类加载器

概述

PleaseCallMeWisely的专栏 703

黑马程序员_Java基础加强笔记:类加载器

一、什么是类加载器 1)类加载器概述 当程序需要用到某个类时,JVM首先把字节码文件从硬盘上加载进来,并做一些处理之后,这些硬盘的字节码文件就变成了内存字节码。这里加载的具体工作是由类加载器ClassLoader来执行的。Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器:BootStrap,ExtClassLoader,AppClassLoader,每

u014214523的专栏 509

黑马程序员-JAVA基础加强-类加载器

------- android培训、java培训、期待与您交流! --------- 类加载器 类加载器的定义和作用    Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必

deepdarkers的专栏 476

黑马程序员——Java类加载器

---------------------- android培训、java培训、期待与您交流! ---------------------- 类加载器: 系统默认的三个:BootStrap,ExtClassLoader,AppClassLoader.类加载器自己本身也是类。 从属结构和使用范围 BootStrap——>JRE/lib/rt.jar   ExtClassLoader——>

xiaoao7jianghu7的专栏 361
上一篇: 黑马程序员___java断言
下一篇: 黑马程序员___java动态代理类
alg89136
博客等级 码龄12年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值