建立平台网站需要花多少钱南京中企动力有限公司

张小明 2026/1/19 20:59:13
建立平台网站需要花多少钱,南京中企动力有限公司,昆山教育云平台网站建设,网站建设及网页设计教案目录 一、回忆类加载过程 二、类加载器 1、定义与本质 2、JVM内置类加载体系 3、自定义类加载器 ClassLoader类中的两个关键方法: 核心原则#xff1a; 4、类加载器加载的顺序 #xff08;1#xff09;核心#xff1a;双亲委派模型下的委托与加载顺序 1#xff…目录一、回忆类加载过程二、类加载器1、定义与本质2、JVM内置类加载体系3、自定义类加载器ClassLoader类中的两个关键方法:核心原则4、类加载器加载的顺序1核心双亲委派模型下的委托与加载顺序1委托阶段向上传递请求2加载阶段向下尝试加载注意2内置类加载器的层级加载范围顺序3触发时机顺序1 触发类加载的常见时机2依赖类的加载顺序三、双亲委派模型1、什么是“双亲”2、定义3、执行流程1步骤 1触发加载请求2步骤 2向上委托3步骤 3顶层加载器自检查4步骤 4向下回传失败结果5步骤 5当前加载器自行加载可视化流程4、底层实现基于ClassLoader源码1loadClass方法的核心源码JDK82核心方法5、双亲委派模型的优点1保证 Java 核心类的安全防止核心 API 被篡改2保证类的唯一性避免重复加载3明确类加载器的职责划分提高加载效率6、打破双亲委派模型1场景一Tomcat 等 Web 容器的类加载问题背景解决方案打破双亲委派2场景二Java SPI服务提供者接口的加载问题背景解决方案线程上下文类加载器Thread Context ClassLoader3场景三热部署 / 热加载问题背景解决方案打破双亲委派的缓存机制4场景四Java 9 的模块化系统一、回忆类加载过程类加载器是类加载过程中加载过程中核心的实现如果不熟悉类加载过程可参考下面链接中的理解类加载过程回忆一下类加载的过程。理解类加载过程https://blog.csdn.net/2201_75450136/article/details/155944812?spm1001.2014.3001.5501二、类加载器1、定义与本质类加载器ClassLoader是 Java 虚拟机JVM的核心组件之一其核心职责是实现类加载过程中的 “加载” 阶段根据类的全限定名如java.lang.String、com.example.User从磁盘、网络、jar 包等数据源中查找并读取对应的.class字节码文件将其转换为 JVM 内存中的java.lang.Class对象该对象是类在 JVM 中的唯一标识后续对类的所有操作都通过这个对象进行。注意类加载器仅负责加载阶段而链接验证、准备、解析和初始化阶段由 JVM 自身完成除了启动类加载器其他类加载器本身也是 Java 类遵循 “被其他类加载器加载” 的规则JVM 中类的唯一性由 “类加载器 类的全限定名” 共同决定—— 即使两个类的全限定名相同只要由不同的类加载器加载JVM 就会将其视为两个完全不同的类这也是类隔离的核心基础。2、JVM内置类加载体系JVM 提供了三层内置类加载器分别负责加载不同来源的类其层级关系和职责清晰划分类加载器类型全称 / 别称实现语言与归属核心加载范围关键特点启动类加载器Bootstrap ClassLoader引导类加载器C/C 实现属于 JVM 内核组件JVM 安装目录下的lib文件夹中核心类库如rt.jar、charsets.jar仅加载符合java.*包的核心类1. 不是 Java 类无法通过代码获取其实例getClassLoader()返回null2. 最高层级的类加载器扩展类加载器Extension ClassLoader平台类加载器Java 9Java 实现sun.misc.Launcher$ExtClassLoader属于 JDK 类库JVM 安装目录下的lib/ext文件夹或通过java.ext.dirs系统属性指定的目录中的类库1. 是启动类加载器的子加载器2. Java 9 后更名为平台类加载器加载范围扩展到系统模块应用类加载器Application ClassLoader系统类加载器System ClassLoaderJava 实现sun.misc.Launcher$AppClassLoader属于 JDK 类库项目的类路径Classpath包括src编译后的.class 文件、第三方 jar 包如 Spring/MyBatis1. 是扩展类加载器的子加载器2. 开发者自定义类的默认加载器平台类加载器Java 9 引入模块化Module后对类加载器体系做了微调移除了扩展类加载器替换为平台类加载器Platform ClassLoader负责加载 JDK 的系统模块和扩展类启动类加载器负责加载核心模块如java.base应用类加载器负责加载应用模块和 Classpath 中的类整体层级关系不变仍遵循双亲委派的核心逻辑。3、自定义类加载器当内置类加载器无法满足特殊需求时如加载加密的.class 文件、从网络下载字节码、动态生成类可以通过继承ClassLoader类实现自定义类加载器。ClassLoader类中的两个关键方法:protected Class loadClass(String name, boolean resolve)加载指定二进制名称的类且实现了双亲委派机制 。其中name为类的二进制名称当resolve的值为 true在加载时调用resolveClass(Class? c)方法解析该类。protected Class findClass(String name)是根据类的二进制名称来查找类默认实现的是空方法。核心原则不重写loadClass()方法避免破坏双亲委派模型仅需重写findClass()方法实现自定义的类查找逻辑通过defineClass()生成 Class 对象将读取到的字节码数组转换为Class对象这是 JVM 提供的底层方法保证类的合法加载。4、类加载器加载的顺序类加载器的加载顺序并非单一的 “线性顺序”而是结合了双亲委派模型的 “委托顺序”、类加载器的 “层级顺序” 以及触发类加载的 “时机顺序”三个维度。1核心双亲委派模型下的委托与加载顺序这是类加载器最基础、最核心的加载顺序也是单个类被加载时的核心流程。简单来说顺序是先向上委托父加载器再向下由子加载器自行加载具体可分为「委托阶段」和「加载阶段」两个步骤。1委托阶段向上传递请求当任意一个类加载器收到类加载请求时会按 “当前类加载器 → 父类加载器 → 启动类加载器”的顺序将请求向上委托直到传递到最顶层的启动类加载器。示例加载com.example.User时的委托顺序应用类加载器AppClassLoader→ 扩展类加载器ExtClassLoader/PlatformClassLoader→ 启动类加载器BootstrapClassLoader2加载阶段向下尝试加载当父加载器无法加载该类时请求会向下回传由子加载器依次尝试自行加载直到某个加载器成功加载或全部失败抛出ClassNotFoundException。示例加载com.example.User时的加载顺序启动类加载器检查核心类库失败→ 扩展类加载器检查扩展目录失败→ 应用类加载器检查Classpath成功加载注意委托阶段是“单向向上”的加载阶段是“单向向下”的每个类加载器在委托前会先检查自身是否已经加载过该类缓存机制避免重复加载。2内置类加载器的层级加载范围顺序从 JVM 内置类加载器的职责划分来看它们的加载范围有明确的优先级顺序启动类加载器优先加载核心类其次是扩展 / 平台类加载器最后是应用类加载器。这种顺序是为了保证核心类的唯一性和安全性。加载优先级类加载器类型加载范围优先级说明最高启动类加载器核心类库java.*先加载 JVM 最核心的类中间扩展 / 平台类加载器扩展类库次加载系统扩展类最低应用类加载器应用类和第三方库最后加载开发者自定义的类举例当同时存在java.lang.String核心类、com.sun.nio.file.ExtendedFileSystem扩展类、com.example.User应用类时加载顺序为java.lang.String启动类加载器→com.sun.nio.file.ExtendedFileSystem扩展类加载器→com.example.User应用类加载器。3触发时机顺序类加载器并非启动时就加载所有类而是“懒加载”按需加载只有在特定时机才会触发类加载不同触发时机的加载顺序遵循“使用即加载”的原则且存在一些固定的先后依赖。1 触发类加载的常见时机第一次创建类的实例new User()触发类加载第一次访问类的静态变量 / 静态方法User.num、User.test()触发类加载反射调用类Class.forName(com.example.User)主动触发类加载加载子类时先加载父类父类的加载顺序优先于子类执行main()方法的类作为程序入口最先被加载SPI 服务加载如ServiceLoader.load(XXX.class)触发实现类的加载。2依赖类的加载顺序当一个类依赖其他类时加载顺序为被依赖的类优先于依赖类加载。如public class Parent {} public class Child extends Parent { private static User user new User(); }当第一次加载Child类时加载顺序为Parent父类由对应加载器加载→User依赖类→Child子类。三、双亲委派模型双亲委派模型Parent Delegation Model是 Java 虚拟机JVM中类加载器的核心设计模式其本质是一种 “向上委托、向下加载” 的层级委派机制旨在通过严格的加载顺序保证 Java 核心类的安全与唯一性同时简化类加载的职责划分。1、什么是“双亲”“双亲” 不是 “父母”是 “委派关系”很多人会误解 “双亲” 是指类加载器的继承关系实际上双亲委派中的 “父类加载器”Parent ClassLoader是指 “委派的上级加载器”而非 Java 中的类继承extends关系。大部分类加载器如应用类加载器、扩展类加载器通过组合方式持有父加载器的引用ClassLoader类中的parent成员变量而非继承。唯一的例外是启动类加载器Bootstrap ClassLoader它是用 C/C 实现的 JVM 内核组件没有父加载器parent为null是整个委派模型的顶层。2、定义当一个类加载器收到类加载请求时它不会立即尝试自己加载而是遵循以下步骤先委托父加载器将加载请求向上传递给其父加载器处理逐层向上委派这个委托过程会一直传递到最顶层的启动类加载器父加载器自检查每个父加载器会先检查自己是否已经加载过该类若已加载则直接返回Class对象若未加载则在自己的加载范围内查找对应的.class文件向下回传失败如果父加载器在自己的加载范围内找不到该类会将 “加载失败” 的结果回传给子加载器子加载器自行加载只有当所有父加载器都加载失败后当前类加载器才会尝试在自己的加载范围内查找并加载该类最终失败抛出异常如果当前类加载器也无法加载则抛出ClassNotFoundException。3、执行流程以加载开发者自定义的com.example.User类为例结合 JVM 内置的三层类加载器完整执行流程如下1步骤 1触发加载请求当代码中执行new com.example.User()时应用类加载器AppClassLoader收到加载com.example.User的请求。2步骤 2向上委托应用类加载器首先检查自己是否已加载过com.example.User通过findLoadedClass()方法若未加载则将请求委托给其父加载器 ——扩展类加载器ExtClassLoader/PlatformClassLoader。扩展类加载器同样先检查缓存若未加载将请求委托给其父加载器 ——启动类加载器BootstrapClassLoader。3步骤 3顶层加载器自检查启动类加载器检查自己的加载范围JVM 安装目录下的lib文件夹如rt.jar发现没有com.example.User类核心类库只有java.*、javax.*等包的类因此返回 “加载失败”。4步骤 4向下回传失败结果扩展类加载器收到启动类加载器的失败结果后检查自己的加载范围lib/ext文件夹或java.ext.dirs指定的目录也找不到com.example.User返回 “加载失败”。应用类加载器收到扩展类加载器的失败结果后开始自行加载。5步骤 5当前加载器自行加载应用类加载器在类路径Classpath下如项目的target/classes目录查找com/example/User.class文件找到后读取字节码并生成Class对象完成加载。可视化流程应用类加载器收到请求 ↓委托 扩展类加载器 ↓委托 启动类加载器检查核心类库失败 ↓回传失败 扩展类加载器检查扩展目录失败 ↓回传失败 应用类加载器检查Classpath成功加载4、底层实现基于ClassLoader源码双亲委派模型的核心逻辑在java.lang.ClassLoader类的loadClass()方法中实现这是 JVM 提供的默认实现所有自定义类加载器都继承了这个逻辑。1loadClass方法的核心源码JDK8protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException { // 1. 加锁保证多线程下类加载的线程安全避免重复加载 synchronized (getClassLoadingLock(name)) { // 2. 检查当前类加载器是否已加载该类缓存优先 Class? c findLoadedClass(name); if (c null) { // 未加载过 long t0 System.nanoTime(); try { // 3. 有父加载器则委托父加载器加载 if (parent ! null) { c parent.loadClass(name, false); } else { // 4. 无父加载器如扩展类加载器委托启动类加载器 c findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // 父加载器加载失败捕获异常继续下一步 } // 5. 所有父加载器都失败调用自身的findClass()方法加载 if (c null) { long t1 System.nanoTime(); c findClass(name); // 性能统计JVM内部用 sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } // 6. 若resolve为true执行类的解析链接阶段的解析步骤 if (resolve) { resolveClass(c); } return c; } }2核心方法方法作用findLoadedClass(name)检查当前类加载器的缓存避免重复加载parent.loadClass(name)委托父加载器加载实现向上委派findBootstrapClassOrNull(name)委托启动类加载器加载仅当parent为null时findClass(name)父加载器失败后当前加载器自行查找类子类需重写resolveClass(c)执行类的解析链接阶段的最后一步5、双亲委派模型的优点设计双亲委派模型的根本目的是保障 Java 程序的安全性和稳定性具体体现在以下三点1保证 Java 核心类的安全防止核心 API 被篡改这是最核心的优势。例如若开发者试图自定义一个java.lang.String类与 Java 核心类同名按照双亲委派模型加载请求会先传递到启动类加载器启动类加载器已经加载了核心的java.lang.String类来自rt.jar会直接返回该类的Class对象自定义的java.lang.String类永远不会被加载从而避免了核心类被恶意替换或篡改的风险。补充JVM 还会对核心类的包名进行校验如java.lang包的类只能由启动类加载器加载即使绕过双亲委派也会抛出SecurityException。2保证类的唯一性避免重复加载由于每个类加载器都会先检查缓存且父加载器优先加载因此同一个类在 JVM 中只会被同一个类加载器加载一次。例如两个不同的类加载器的子加载器请求加载com.example.User最终都会委托到应用类加载器加载从而保证User类的Class对象在 JVM 中是唯一的避免了类冲突。3明确类加载器的职责划分提高加载效率JVM 的内置类加载器有明确的加载范围启动类加载器负责核心类库扩展类加载器负责系统扩展类应用类加载器负责应用类和第三方库。双亲委派模型让每个加载器只关注自己的职责范围无需处理其他范围的类从而提高了类加载的效率和可维护性。6、打破双亲委派模型虽然双亲委派模型是 JVM 的默认规则但在某些场景下由于其自身的局限性需要被打破。这些场景也恰恰体现了 Java 类加载机制的灵活性。1场景一Tomcat 等 Web 容器的类加载问题背景Tomcat 作为 Web 容器需要实现多 Web 应用的类隔离不同的 Web 应用可能依赖不同版本的第三方库如应用 A 用 Spring 5应用 B 用 Spring 6若遵循双亲委派应用类加载器会只加载一次 Spring 类导致版本冲突。解决方案打破双亲委派Tomcat 自定义了类加载器体系如WebappClassLoader其加载顺序与双亲委派相反先加载当前 Web 应用WEB-INF/classes目录下的类再加载当前 Web 应用WEB-INF/lib下的 jar 包中的类最后才委托父加载器Tomcat 的CommonClassLoader加载公共类和核心类。核心目的让每个 Web 应用拥有独立的类空间实现类隔离。2场景二Java SPI服务提供者接口的加载问题背景SPI 是 Java 的一种服务发现机制如 JDBC、JNDI、SLF4J以 JDBC 为例java.sql.Driver接口由启动类加载器加载属于核心类库rt.jar具体的驱动实现如 MySQL 的com.mysql.cj.jdbc.Driver在 Classpath 中应由应用类加载器加载按照双亲委派启动类加载器无法委托子加载器加载导致无法找到驱动实现。解决方案线程上下文类加载器Thread Context ClassLoaderJVM 提供了线程上下文类加载器允许通过Thread.currentThread().getContextClassLoader()获取当前线程的类加载器默认是应用类加载器从而打破双亲委派的层级限制DriverManager启动类加载器加载通过线程上下文类加载器获取应用类加载器应用类加载器加载 Classpath 中的 JDBC 驱动实现类驱动类被实例化并注册到DriverManager中。这是一种“父加载器调用子加载器”的逆向委派本质上打破了双亲委派的单向委托规则。3场景三热部署 / 热加载问题背景热部署如 Spring Boot DevTools、JRebel需要在不重启 JVM 的情况下动态更新类的字节码。解决方案打破双亲委派的缓存机制自定义类加载器加载新的类字节码每次热加载时创建新的类加载器实例加载更新后的类由于类的唯一性由 “类加载器 类名” 决定新的类加载器会生成新的Class对象从而实现类的动态替换。这种方式打破了 “类只被加载一次” 的缓存规则本质上也是对双亲委派的灵活调整。4场景四Java 9 的模块化系统Java 9 引入了模块化Module系统对类加载器体系进行了微调移除了扩展类加载器替换为平台类加载器允许模块指定 “导出” 和 “开放” 的包类加载的范围由模块决定。虽然整体仍遵循双亲委派的核心逻辑但模块化系统让类加载的范围更精细也在一定程度上突破了传统双亲委派的职责划分。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

好用的wordpress编辑器济南网站优化排名

Linux进程管理:优先级、亲和性与实时系统解析 1. 进程调度中的“乒乓效应”及改进 在进程调度中,曾经存在一种“乒乓效应”。当两个进程都调用 sched_yield() 且拥有非零时间片时,旧的 sched_yield() 行为会导致内核轮流调度这两个进程,每个进程依次表示“不,调度其…

张小明 2026/1/17 22:37:29 网站建设

如何给网站做二维码济源做网站的公司

随着ChatGPT、Llama、文心一言等大模型的爆发式发展,AI技术已从前沿科研走向产业落地,大模型相关技能成为程序员提升核心竞争力的关键。无论是传统开发岗转型AI,还是零基础小白入门,系统学习大模型知识都能打开全新的职业赛道。数…

张小明 2026/1/17 22:37:30 网站建设

4G访问wordpress深圳网站优化教程

5个意想不到的桌面管理技巧:让窗口置顶成为你的效率倍增器 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在繁杂的电脑工作中,你是否经常为窗口切换而烦…

张小明 2026/1/17 22:37:30 网站建设

牡丹江网站开发商品关键词举例

Notepadqq:终极轻量级代码编辑解决方案深度解析 【免费下载链接】notepadqq A simple, general-purpose editor for Linux 项目地址: https://gitcode.com/gh_mirrors/no/notepadqq 你是否厌倦了那些启动缓慢、占用资源巨大的代码编辑器?是否渴望…

张小明 2026/1/17 22:37:31 网站建设

建立站点的基本步骤上海做网站哪里好

奶茶销售服务管理平台 目录 基于springboot vue奶茶销售服务管理平台系统 一、前言 二、系统功能演示 详细视频演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue奶茶销售服…

张小明 2026/1/17 22:37:34 网站建设

宏基陆通工程建设有限公司网站莱芜网络推广公司电话

💟博主:程序员:君君SDN作者、博客专家、全栈领域优质创作者 💟专注于计算机毕业设计,大数据、深度学习、Java、小程序、python、安卓等技术领域 📲文章末尾获取源码数据库 🌈还有大家在毕设选题…

张小明 2026/1/17 22:37:34 网站建设