理解Java类加载原理

浏览器中页面Java无法加载解决办法 浏览器中页面Java无法加载解决办法 第一次写,生涩难免,作为记录。希望能减少后来者入坑的概率 原因 之前也遇到过类似的问题,忘记是哪个网站了,在展示蛋白质3D结构的时候缺少展示的窗口。可能当时的浏览器有过提示,然后折腾半天将Java安装设置好。这次的生物信息学实验课上再次遇到这个问题,又是半天时间的花费,恰巧注册了这个博客,对此做个记录。 描述 在edge浏览器中,打点法网站dotlet(lin... 阅读详情

本文转自:http://www.moon-soft.com/doc/22670.htm

第一部分. 提示
我需要读这篇文章吗?
Java类加载器对Java系统的运行是至关重要的,但是却常常被我们忽略。Java类加载器负载在运行时查找和加载类。自定义类加载器可以完全改变类的加载方式,以自己喜欢的方式来个性化你的Java虚拟机。本文简要的介绍Java类加载器,然后通过一个构造自定义类加载器的例子来说明,这个类加载器在加载类前会自动编译代码。你将学到类加载器到底是干什么的,如何创建你自己的类加载器。只要你有一些基本的Java知识,知道如何创建、编译、运行一个命令行Java程序以及一些Java类文件的基本概念,你就可以理解本文的内容了。读完本文,你应该能够:
* 扩张Java虚拟机的功能
* 创建一个自定义的类加载器
* 如何把自定义的类加载器整合到你的应用程序中
* 修改你的类加载器以兼容Java2
获得帮助 
对本文有任何问题,可以联系作者Greg Travis,油箱:mito@panix.com 。
第二部分. 简介
类加载器是什么?
Java和其他语言不同的是,Java是运行于Java虚拟机(JVM)。这就意味着编译后的代码是以一种和平台无关的格式保存的,而不是某种特定的机器上运行的格式。这种格式和传统的可执行代码格式有很多重要的区别。具体来说,不同于C或者C++程序,Java程序不是一个独立的可执行文件,而是由很多分开的类文件组成,每个类文件对应一个Java类。 另外,这些类文件并不是马上加载到内存,而是当程序需要的时候才加载。 类加载器就是Java虚拟机中用来把类加载到内存的工具。而且,Java类加载器也是用Java实现的。这样你就不需要对Java虚拟机有深入的理解就可以很容易创建自己的类加载器了。
为什么要创建类加载器?
既然Java虚拟金已经有了类加载器,我们还要自己创建其他的呢?问得好。默认的类加载器只知道如何从本地系统加载类。当你的程序完全在本机编译的话,默认的类加载器一般都工作的很好。但是Java中最激动人心的地方之一就是很容易的从网络上而不只是本地加载类。
举个例子,浏览器可以通过自定义的类加载器加载类。 还有很多加载类的方式。除了简单的从本地或者网络外,你还可以通过自定义Java中最激动人心的地方之一:
* 执行非信任代码前自动验证数字签名
* 根据用户提供的密码解密代码
* 根据用户的需要动态的创建类
你关心的任何东西都能方便的以字节码的形式集成到你的应用中
自定义类加载器的例子
如果你已经使用过JDK(Java软件开发包)中的appletviewer(小应用程序浏览器)或者其他Java嵌入式浏览器,你就已经使用了自定义类加载器了。Sun刚刚发布Java语言的时候,最令人兴奋的一件事就是观看Java如何执行从远程网站下载的代码。执行从远程站点通过HTTP连接传送来的字节码看起来有点不可思议。之所以能够工作,因为Java有安装自定义类加载器的能力。小应用程序浏览器包含了一个类加载器,这个类加载器不从本地找Java类,而是访问远程服务器,通过HTTP加载原始字节码文件,然后在Java虚拟机中转化为Java类。当然类加载器还做了其他的很多事情:他们阻止不安全的Java类,而且保持不同页面上的不同小程序不会互相干扰。Luke Gorrie写的一个包Echidna是一个开放的Java软件包,他允许在一个Java虚拟机中安全的运行多个Java应用程序。它通过使用自定义类加载器给每个应用程序一份类文件的拷贝来阻止应用程序之间的干扰。
我们的类加载器例子
我们知道了类加载器是如何工作的,也知道如何定义自己的类加载器了,接下来我们创建一个名字为CompilingClassLoader (CCL)的自定义类加载器。CCL为我们做编译工作,我们就不用自己手动编译了。 这基本上相当于有一个"make"程序构建到我们的运行环境。注意:我们进行下一步之前,有必要搞清楚一些相关的概念。系统在JDK版本1.2(也就是我们说的Java 2平台)得到很到改进。本文是在JDK1.0和1.1的版本下写的,但是所有的东西都能在后来的版本工作。ClassLoader也在Java2种有所改进,第五部分有详细介绍。
第三部分.ClassLoader的结构
总揽
类加载器的基本目的是服务于对Java类的请求。Java虚拟机需要一个类的时候,就把一个类名给类加载器,然后类加载器试图返回一个对应的类实例。可以通过在不同的阶段覆盖相应的方法来创建自定义的类加载器。接下来我们将了解到类加载器的一些主要方法。你会明白这些方法是干什么的,他们在加载类文件的时候是如何工作的。你还将知道创建自定义类加载器的时候需要写哪些代码。在下一部分,你将利用这些知识和我们自定义的CompilingClassLoader一起工作。
方法 loadClass
ClassLoader.loadClass() 是ClassLoader的入口点。方法签名如下:
Class loadClass( String name, boolean resolve);
参数name指定Java虚拟机需要的类的全名(含包名),比如Foo或者java.lang.Object。
参数 resolve指定该类是否需要解析
你可以把类的解析理解为完全为运行做好准备。解析一般都不需要。如果Java虚拟机只想知道这个类是否存在或者想知道它的父类的话,解析就完全没有必要了。 在Java1.1和它以前的版本,如果要自定义类加载器,loadClass方法是唯一需要在子类中覆盖的方法.
(ClassLoader在Java1.2中有所改变,提供了方法findClass())。
方法 defineClass
defineClass 是ClassLoader中一个很神秘的方法。这个方法通过一个字节数组来构建类实例。这个包含数据的原始字节数组可能来自文件系统,也可能是来自网络。defineClass 表明了Java虚拟机的复杂性,神秘性和平台依赖性-它通过解释字节码把它转化为运行时数据结构,检查有效性等等。但是不用担心,这些都不用你去实现。其实,你根本不能覆盖它,因为该方法被关键字final修饰。
方法 findSystemClass
findSystemClass方法从本地系统加载文件。它在本地系统寻找类文件,如果找到了,调用defineClass把原始字节数组转化成类对象。这是运行Java应用时Java虚拟机加载类的默认机制。对于自定义类加载器,只有在我们无法加载之后才需要用findSystemClass。 原因很简单: 我们的类加载器负责执行类加载中的某些特定的步骤,但并不是对所有的类。比如,即使我们的类加载器从远程站点加载了某些类,仍然有很多基本的类要从本地系统加载。
这些类不是我们关心的,所以我们让Java虚拟机以默认的方式加载他们:从本地系统。这就是findSystemClass做的事情。整个过程大致如下:
* Java虚拟机请求我们自定义的类加载器加载类。
* 我们检查远程站点是否有这个需要加载的类。
* 如果有,我们获取这个类。
* 如果没有,我们认为这个是类在基本类库中,调用findSystemClass从文件系统中加载。

在大多数自定义类加载器中,你应该先调用findSystemClass来节省从远程查找的时间。实际上,正如我们将在下一部分看到的,只有当我们确定我们已经自动编译完我们的代码后才允许Java虚拟机从本地文件系统加载类。
方法resolveClass
正如上面说的,类记载可以分为部分加载(不解析)和完全加载(包括解析)。我们创建自定义类加载器的时候,可能要调用resolveClass。
方法 findLoadedClass
findLoadedClass实现一个缓存:当要求loadClass来加载一个类的时候,可以先调用这个方法看看这个类是否已经被加载,防止重新加载一个已经被加载的类。这个方法必须先被调用,我们看一下这些方法是如何组织在一起的。
我们的例子实现loadClass执行以下的步骤。(我们不指定通过某种具体的技术获得类文件,-它可能从网络,从压缩包或者动态编译的。无论如何,我们获得的是原始字节码文件)
* 调用findLoadedClass检查这个类是否已经加载。
* 如果没有加载,我们通过某种方式获得原始字节数组。
* 假如已经获得该数组,调用defineClass把它转化成类对象。
* 如果无法获得该原始字节数组,调用findSystemClass 检查是否可以从本地文件系统中记载。
* 如果参数resolve为true,调用resolveClass来解析类对象。
* 如果还没有找到类,抛出一个ClassNotFoundException异常。
* 否则,返回这个类。
现在我们对类加载器的应用知识有个较全面的了解,可以创建自定义类加载器了。在下一部分,我们将讨论CCL。
第四部分. CompilingClassLoader
CCL给我们展示了类加载器的功能, CCL的目的是让我们的代码能够自动编译和更新。下面描述它是怎么工作的:
* 当有一个类的请求时,先检查磁盘的当前目录和子目录上是否存在这个类文件。
* 如果没有类文件,但是却有源代码文件,调用Java编译器编译生成类文件。
* 如果类文件已经存在,检查该类文件是否比源代码文件陈旧。如果类文件比源代码文件陈旧,调用Java编译器重新生成类文件。
* 如果编译失败,或者由于其他原因导致无法从源文件生成类文件,抛出异常ClassNotFoundException。
* 如果还没有获得这个类,可能存在其他的类库里,调用findSystemClass看是否能找到。

* 如果没有找到,抛出异常ClassNotFoundException。
* 否则,返回该类。
Java编译是如何实现的?
在我们进一步讨论前,我们需要先弄清楚Java的编译过程。通常,Java编译器不仅仅编译指定的那些类。如果指定的那些类需要的话,它还会编译其它的一些相关类。CCL会一个一个的编译我们在应用程序中需要编译的那些类。不过,一般来说,编译器编译完第一个类后,CCL将会发现其实其他需要的相关类已经被编译了。为什么呢?Java编译器使用我们差不多的规则:如果一个了类不存在或者源文件已经被更新,就会编译这个类。Java编译器基本上比CCL早了一步,大部分工作都被Java编译器完成了。我们看起来就像是CCL在编译这些类。在大多数情况下,你将发现它是在主函数类中调用编译器,就仅仅这些而已--简单的一个调用就够了。 不过有一种特殊情况,这些类在第一次出现的时候不编译。如果你根据类名加载一个类,使用方法Class.forName,Java编译器并不知道是否需要这个类。在这种情况下,你发现CCL再次调用编译器来编译该类。第六部分的代码说明了这个过程。
使用CompilationClassLoader
为了使用CCL,我们不能直接运行我们的程序,必须以一种特殊的方式运行,就像这样:
% java Foo arg1 arg2
我们这样运行它:
% java CCLRun Foo arg1 arg2
CCLRun是一个特殊的存根程序,它来创建CompilingClassLoader 并且用它来加载我们的主函数类,这样可以确保所有的整个程序都是由CompilingClassLoader加载的。CCLRun利用Java反射API来调用主函数类的主函数并且给这个函数传递参数。想了解更多,参考第六部分的源代码。
运行示例
我们演示一下整个过程式怎么工作的。
主程序是一个叫做Foo的类,它创建一个类Bar的实例。这个Bar实例又创建一个类Baz的实例,类Baz存在于包baz中,这是为了演示CCL如何从子包中加载类。Bar还根据类名加载类Boo,这个也是CCL完成的。所有的类都加载了就可以运行了。利用第六章的源代码来执行这个程序。编译CCLRun和CompilingClassLoader。确保你没有编译其它的类(Foo, Bar, Baz, and Boo),否则CCL将不起作用,。
% java CCLRun Foo arg1 arg2
CCL: Compiling Foo.java...
foo! arg1 arg2
bar! arg1 arg2
baz! arg1 arg2
CCL: Compiling Boo.java...
Boo!
注意到为了Foo.java第一次调用编译器,同时也把Bar和baz.Baz一起编译了俄。而类Boo直道需要加载的时候,CCL才再次调用编译器来编译它。
第五部分.Java2中对类加载器的改进
概览
在Java1.2和以后的版本中, 类加载器有了很大的改进。以前的代码仍然可以工作, 但是新的系统让我们的实现更容易。这种新模型就是代理委托模型,就是说如果这个类加载器找不到某个类,它会让他的父类加载器来找。系统类加载器是所有类加载器的祖先, 系统类加载器通过默认的方式加载类--也就是从本地文件系统中加载。覆盖loadClass方法一般都尝试几种方式来加载类,如果你写了很多类加载器,你会发现你只是一次又一次在这个复杂的方法中作一些修改而已。Java1.2种loadClass的默认实现包含了寻找类的最普通的途径,允许你覆盖findClass方法,loadClass在适当的是否调用findClass方法。这样做的好处是你不需要覆盖loadClass,你只需要覆盖findClass,这样可以减少工作量。
新增方法: findClass
这个方法被loadClass的默认实现调用。findClass的目标是包含所有类加载器特定的代码,而不需要重复这些代码(比如在指定的方法失败的时候调用系统类加载器)。
新增方法: getSystemClassLoader
不论你是否覆盖方法findClass和loadClass, 方法getSystemClassLoader都可以直接访问系统类加载器(而不是通过findSystemClass间接的访问)。
新增方法: getParent
为了把请求委托给父类加载器,通过这个方法可以获得这个类加载器的父类加载器。当自定义类加载器中的特定方法无法找到类的时候你可能把请求委托给父类加载器。类加载器的父
类加载器包含创建这个类加载器的代码。
第六部分. 源代码
CompilingClassLoader.java
以下是文件CompilingClassLoader.java内容

CCRun.java
一下是CCRun.java文件

Foo.java
以下是文件Foo.java内容

Bar.java
以下是文件Bar.java内容

baz/Baz.java
以下是文件baz/Baz.java内容

Boo.java
以下是文件Boo.java内容

第七部分. 总结
总结
通过本文你是否意识到,创建自定义类加载器可以让你深入到Java虚拟机的内部。你可以从任何资源加载类文件,或者动态的生成它,这样你就可以通过扩展这些功能做很多你感兴趣的事,还能完成一些强大的功能。
关于ClassLoader的其它话题
就像本文开头说的,自定义类加载器在Java嵌入式浏览器和小应用程序浏览器中起着重要的作用。下面给出类加载器的其它功能。
* 安全: 自定义的类加载器可以在把这个类交给Java虚拟机之前检查它是否有正确的数字签名。你也可以自己创建一个"沙箱"来阻止对某些方法的调用,这是通过检查源代码,阻止该类对沙箱之外的操作来实现的。
* 加密:通过自定义类加载器可以动态的解码,所有你的类文件就无法通过反编译被查看到代码。用户需要密码才能运行程序,这个密码用来对代码解密。
* 存档:你是否需要将你的代码以某种格式或者压缩形式发布吗?自定义ClassLoader可以从你想要的任何资源中生成字节码文件。
* 自提取程序:可以把整个应用程序编译到一个可执行的类文件中,这个文件包括压缩过或者加密过的数据,有了内部类加载器,当程序运行的时候,他把自己解包到内存-不需要事前安装。
* 动态生成:可以动态的生成那些被引用的类-整个程序需要用的类都可以动态的生成然后交给Java虚拟机。

 

Java类中热替换查看这篇文章:http://xiaozhao1795.blog.163.com/blog/static/109704684201022152693/

【深入理解Java原理】Java类加载机制 Java类加载机制 本文章完整内容已经发布在微信公众号:程序员开发者社区,欢迎关注,后台回复: 资源 ,有惊喜 所谓类加载机制是指 Java 虚拟机如何加载class文件? 类加载机制 虚拟机将类的数据从Class文件加载到内存,并对数据进行校验,转换解析,和初始化最终形成Java虚拟机可以使用的Java类型... 阅读详情

相关推荐

MMWCAS-DSP-EVM与AWR2243实战:从开箱到数据采集的完整避坑指南

本文提供了MMWCAS-DSP-EVM与AWR2243毫米波雷达评估板从开箱、软硬件准备、固件烧录到数据采集的完整实战指南。重点解析了硬件连接、软件版本匹配、固件烧录、网络配置及MMWave Studio GUI操作等关键步骤,并汇总了常见问题排查方法,帮助开发者快速上手并规避常见陷阱。

algae的博客 502

java类加载过程

如果创建一个对象, 运行的顺序是: 静态变量(按声明顺序) 静态块(按声明顺序) 非静态变量(按声明顺序) 非静态块(按声明顺序) 构造方法 如果加载一个类(Class.forName("jty.Test")), 运行顺序是: 静态变量(按声明顺序) 静态块(按声明顺序) 如果只调用静态方法(Test.staticMethod()),

Jinty 915

如何处理MIGO取消物料凭证报错:“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”

记录一次处理MM模块的报错。这次连续处理了两个错误,“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”。把过程和操作步骤记录下一。方便日后回头查找。

IT小职员 6231

lazyload实现原理(图片延迟加载)

lazyload实现原理

cc的博客 990

Ubuntu 24.04 搭建 Squid 代理服务器终极指南:从入门到 HTTPS 缓存AI模型

本文详细指导在Ubuntu 24.04系统部署Squid代理服务器,实现AI大模型文件的高效缓存。重点内容包括:1) 安装squid及必备的squid-openssl扩展包;2) 配置HTTPS拦截(SSL-Bumping)功能,创建CA证书和SSL数据库;3) 优化缓存策略,设置4TB存储空间并强制缓存常见大文件格式;4) 结合华为防火墙实现透明代理。文章特别强调实际部署中的关键注意事项和常见错误解决方案,如证书路径配置、权限设置等问题,帮助用户快速搭建企业级缓存代理服务。

zlt315的博客 1920

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)。

非科班Java出身GISer的博客 701

TreadLocal对象的作用和实现原理

TreadLocal对象的作用和实现原理 作用: ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定的线程中可以获取到存储的数据,对于其他线程来说则无法取到数据。 实现原理: ThreadLocal是一个泛型类,定义为public class ThreadLocal,只要弄清楚ThreadLocal的get方法和set方法,就可以明白它的实...

nanZhaiXiaoLang的博客 520

【Frida Android】实战篇8:客户端证书认证绕过 Hook 教程

通过重写类的方法,自定义证书校验逻辑;利用配置文件,从系统层面管理证书信任策略;以及通过 OkHttp 框架提供的方法,实现证书的强绑定校验。这些内容主要围绕客户端如何验证服务端证书的合法性展开。客户端证书认证。当 APK 预置了客户端证书,并且服务端会对客户端证书进行校验时,传统的中间人攻击方式将面临新的挑战。我们将深入分析这种场景的工作原理,并详细介绍如何通过技术手段获取客户端证书、配置中间人工具,最终成功实现抓包分析。

水滴石穿 1425

ThreadLocal原理及用法详解

一.什么是ThreadLocal ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性。ThreadLocal 不是一个线程,而是一个线程的本地化对象。当某个变量在使用 ThreadLocal 进行维护时,时ThreadLocal 为使用该变量的每个线程分配了一个独立的变量副本。每个线程可以自行操作自己对应的变量副本,而不会影响其他线程的变...

yuzhao优快云YY的博客 338

apollo自动驾驶进阶学习之:如何实现施工路段限速绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。.........

qq_41593516的博客 6596

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.youkuaiyun.com/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

如何理解Java的类加载器及其工作原理?

Java允许开发者通过继承类来自定义自己的类加载器。指定特定路径下的类文件。实现动态代理或热部署功能。@Override// 尝试从自定义路径中加载类= -1) {throw new ClassNotFoundException("无法从指定路径读取类文件", e);System.out.println("实例化成功: " + instance);

wang15510689957的博客 986

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java底层原理:深入理解类加载机制与反射

在Java开发中,类加载机制和反射是Java语言的核心特性之一。它们不仅影响Java应用的运行效率,还为Java开发者提供了强大的动态编程能力。本文将深入探讨Java类加载机制和反射的底层原理,帮助你更好地理解Java应用的运行机制。

weixin_66924704的博客 902

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 类加载原理_理解Java类加载原理

第六部分. 源代码CompilingClassLoader.java以下是文件CompilingClassLoader.java内容import java.io.*;/*CompilingClassLoader动态的编译Java源文件。它检查.class文件是否存在,.class文件是否比源文件陈旧。*/public class CompilingClassLoader extends Class...

weixin_33384949的博客 172

蓝牙模块HM-10手册

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

【小家Java】从原理层面理解Java中的类加载器:ClassLoader、双亲委派模型、线程上下文类加载器

前言 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个Java 类,即 java.lang.Class类的一个实例。 类加载器是平时开发中基本不会接触的问题,但是在高阶应用种必须要深入其原理才能予以自用。比如tomcat加载web-jar就是通过自己的ClassLoader去加载进来的等等。同时这个也是高...

架构师:通透,才能写出好代码! 1573

深入理解Java类加载器(一):Java类加载原理解析

每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。

Rico's Blogs 6万+

深入理解Java类加载机制:从原理到实战详解

本文深入解析了Java类加载机制的核心原理与实战应用。主要内容包括:1)类加载的完整生命周期(加载、验证、准备、解析、初始化等阶段);2)双亲委派模型的工作原理及其安全意义;3)双亲委派模型的缺陷分析与打破方法;4)自定义类加载器的实现方案;5)典型应用场景如热部署、模块化隔离等。 通过流程图解和源码分析,文章揭示了类加载器如何保障Java程序的安全性与稳定性,并提供了自定义类加载器的完整实现示例,帮助开发者在实际项目中灵活运用类加载机制解决复杂问题。

2504_94294476的博客 2624

深入理解Java类加载器(1):Java类加载原理解析

1       基本信息 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载。Java的类加载机制是java技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和java语言的动态性

Jack Zhou的专栏 6万+
上一篇: Apache中安装新的模板
下一篇: UBUNTU下面安装ICE失败记录过程
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值