当前位置: 首页 > news >正文

classLoader 原理

为什么80%的码农都做不了架构师?>>>   hot3.png

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

首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。
方法 loadClass() 抛出的是 java.lang.ClassNotFoundException 异常;方法 defineClass() 抛出的是 java.lang.NoClassDefFoundError 异常。
对于一个类加载器实例来说,相同全名的类只加载一次,即 loadClass 方法不会被重复调用。

一般来说,自己开发的类加载器只需要覆写 findClass(String name) 方法即可。
java.lang.ClassLoader 类的方法 loadClass() 封装了前面提到的代理模式的实现。
该方法会首先调用 findLoadedClass() 方法来检查该类是否已经被加载过;
如果没有加载过的话,会调用父类加载器的 loadClass() 方法来尝试加载该类;
如果父类加载器无法加载该类的话,就调用 findClass() 方法来查找该类。

因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass() 方法,而是覆写 findClass()方法。

转载于:https://my.oschina.net/renyg/blog/175008

相关文章:

  • JAVASE贪吃蛇开发记录
  • How to use Cisco Documentation for CCIE
  • MySQL与Oracle之间互相拷贝数据的Java程序
  • Servlet线程安全的解决方法
  • php 多个文件上传
  • mysql单表体积和一个库设计多少张表为妥
  • 安装DPM 2012 R2时报错一例
  • 错误日志记录
  • 动态编译执行java类
  • 第三部分:Android 应用程序接口指南---第一节:应用程序组件---第三章3-3日历provider...
  • Android中的回调Callback
  • 组成_05_CPU
  • 组播地址列表
  • linux 关闭SSH 连接用户
  • 编程面试的10大算法概念汇总
  • 【RocksDB】TransactionDB源码分析
  • C++类的相互关联
  • Create React App 使用
  • JavaScript类型识别
  • JS数组方法汇总
  • Laravel Mix运行时关于es2015报错解决方案
  • Mithril.js 入门介绍
  • mockjs让前端开发独立于后端
  • Python学习之路13-记分
  • spring + angular 实现导出excel
  • 当SetTimeout遇到了字符串
  • 分布式事物理论与实践
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 深入 Nginx 之配置篇
  • 使用docker-compose进行多节点部署
  • 学习Vue.js的五个小例子
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 1.Ext JS 建立web开发工程
  • Java数据解析之JSON
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 湖北分布式智能数据采集方法有哪些?
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • # 数论-逆元
  • #1014 : Trie树
  • (12)Hive调优——count distinct去重优化
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (二)c52学习之旅-简单了解单片机
  • (二)hibernate配置管理
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • .net 7 上传文件踩坑
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 微服务 服务保护 自动重试 Polly
  • .Net的C#语言取月份数值对应的MonthName值
  • @AliasFor注解
  • @requestBody写与不写的情况
  • @SuppressWarnings(unchecked)代码的作用
  • @TableLogic注解说明,以及对增删改查的影响