摘要:如果它们都没有加载到这个类时,则抛出异常。只有两者同时满足的情况下,才认为这两个是相同的。就算两个是同一份字节码,如果被两个不同的实例所加载,也会认为它们是两个不同。
简介
程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。
默认的类加载器 BootStrap ClassLoaderJava类加载层次中最顶层的类加载器,负责加载JDK中的核心类库。
Extension ClassLoader扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar
App ClassLoader系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件
ClassLoader加载类的原理 原理介绍ClassLoader使用的是双亲委托模型来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(Bootstrap ClassLoader)本身没有父类加载器,但可以用作其它ClassLoader实例的的父类加载器。当一个ClassLoader实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的类加载器Bootstrap ClassLoader试图加载,如果没加载到,则把任务转交给Extension ClassLoader试图加载,如果也没加载到,则转交给App ClassLoader 进行加载,如果它也没有加载得到的话,则返回给委托的发起者,由它到指定的文件系统或网络等URL中加载该类。如果它们都没有加载到这个类时,则抛出ClassNotFoundException异常。否则将这个找到的类生成一个类的定义,并将它加载到内存当中,最后返回这个类在内存中的Class实例对象。
使用双亲委托模型可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义的类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时就被引导类加载器(Bootstrcp ClassLoader)加载,所以用户自定义的ClassLoader永远也无法加载一个自己写的String,除非你改变JDK中ClassLoader搜索类的默认算法。
JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。只有两者同时满足的情况下,JVM才认为这两个class是相同的。就算两个class是同一份class字节码,如果被两个不同的ClassLoader实例所加载,JVM也会认为它们是两个不同class。
引用
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70183.html
摘要:类加载器三杰有三类,分别是以及。线程上下文类加载器线程上下文类加载器可以不遵循双亲委派机制。免费领取验证码内容安全短信发送直播点播体验包及云服务器等套餐更多网易技术产品运营经验分享请访问网易云社区。文章来源网易云社区 本文由作者张远道授权网易云社区发布。 类加载器三杰 jvm有三类classloader,分别是bootstrap classloader,extended classlo...
摘要:作用负责将加载到中审查每个类由谁加载父优先的等级加载机制将字节码重新解析成统一要求的对象格式类结构分析为了更好的理解类的加载机制,我们来深入研究一下和他的方法。就算两个是同一份字节码,如果被两个不同的实例所加载,也会认为它们是两个不同。 申明:本文首发于 详细深入分析 ClassLoader 工作机制 ,如有转载,注明原出处即可,谢谢配合。 什么是 ClassLoader ? 大家...
摘要:它们是通过来自远程的服务器的连接发送字节码并在本地运行,这一点令人兴奋。中有一个自定义的,它不是从本地文件系统加载类文件,而是从远程服务器上获取,通过加载原始字节码,再在中转化为类。它将字节码解析为运行时的数据结构,检查其有效性等。 前言 Java ClassLoader是java运行系统中一个至关重要但是经常被忽略的组件。它负责在运行时寻找并加载类文件。创建自定义的ClassLoad...
摘要:的打包结构改动是这个引入的这个的本意是简化的继承关系,以一种直观的优先的方式来实现,同时打包结构和传统的包应用更接近。目前的继承关系带来的一些影响有很多用户可能会发现,一些代码在里跑得很好,但是在实际部署运行时不工作。 前言 对spring boot本身启动原理的分析,请参考:http://hengyunabc.github.io/s... Spring boot里的ClassLoad...
摘要:示例如下动态类重新加载动态类重新加载有一些挑战。为了上面代码的正常运行,你当然需要实现自己的类加载器,让接口或超类由其父类加载。 Java中可以在运行时加载和重新加载类,虽然并不像我们想像中那么简单。本文将解释何时、怎样在Java中加载、重新加载类。你可以争论动态加载类是Java反射的一部分还是Java核心的一部分。不管怎样,我把它放在了Java反射中,因为没有更好的地方放置它。 类加...
阅读 2227·2021-11-25 09:43
阅读 3092·2021-10-14 09:42
阅读 3465·2021-10-12 10:12
阅读 1482·2021-09-07 10:17
阅读 1867·2019-08-30 15:54
阅读 3160·2019-08-30 15:54
阅读 1521·2019-08-30 15:53
阅读 1831·2019-08-29 11:21