- 浏览: 263553 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
zhagener:
package com.huawei.qyq.impl;imp ...
EasyMock使用说明 -
LetCode:
将String转换成InputStream -
Mr_kimilo:
MyEclipse6.5安装的时候出现问题: JS Test ...
javascript测试工具: JsTestDriver -
jersey109:
我同意楼下的,SQLException和IOException ...
check exception和uncheck exception -
jersey109:
楼主,你不说CODE,我觉得你对RuntimeExceptio ...
check exception和uncheck exception
jvm classLoader architecture :
a, Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.
b, Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作
c, System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.
b, User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.
类加载器的特性:
1, 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
2, 为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 ” 双亲委派的加载链 ” 结构.
如下图:
Class Diagram:
类图中, BootstrapClassLoader是一个单独的java类, 其实在这里, 不应该叫他是一个java类。
因为, 它已经完全不用java实现了。
它是在jvm启动时, 就被构造起来的, 负责java平台核心库。(具体上面已经有介绍)
启动类加载实现 (其实我们不用关心这块, 但是有兴趣的, 可以研究一下 ):
bootstrap classLoader 类加载原理探索
自定义类加载器加载一个类的步骤 :
ClassLoader 类加载逻辑分析, 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:
- // 检查类是否已被装载过
- Class c = findLoadedClass(name);
- if (c == null ) {
- // 指定类未被装载过
- try {
- if (parent != null ) {
- // 如果父类加载器不为空, 则委派给父类加载
- c = parent.loadClass(name, false );
- } else {
- // 如果父类加载器为空, 则委派给启动类加载加载
- c = findBootstrapClass0(name);
- }
- } catch (ClassNotFoundException e) {
- // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其
- // 捕获, 并通过findClass方法, 由自身加载
- c = findClass(name);
- }
- }
// 检查类是否已被装载过 Class c = findLoadedClass(name); if (c == null ) { // 指定类未被装载过 try { if (parent != null ) { // 如果父类加载器不为空, 则委派给父类加载 c = parent.loadClass(name, false ); } else { // 如果父类加载器为空, 则委派给启动类加载加载 c = findBootstrapClass0(name); } } catch (ClassNotFoundException e) { // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其 // 捕获, 并通过findClass方法, 由自身加载 c = findClass(name); } }
用Class.forName加载类
Class.forName使用的是被调用者的类加载器来加载类的.
这种特性, 证明了java类加载器中的名称空间是唯一的, 不会相互干扰.
即在一般情况下, 保证同一个类中所关联的其他类都是由当前类的类加载器所加载的.
- public static Class forName(String className)
- throws ClassNotFoundException {
- return forName0(className, true , ClassLoader.getCallerClassLoader());
- }
- /** Called after security checks have been made. */
- private static native Class forName0(String name, boolean initialize,
- ClassLoader loader)
- throws ClassNotFoundException;
public static Class forName(String className) throws ClassNotFoundException { return forName0(className, true , ClassLoader.getCallerClassLoader()); } /** Called after security checks have been made. */ private static native Class forName0(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException;
上图中 ClassLoader.getCallerClassLoader 就是得到调用当前forName方法的类的类加载器
线程上下文类加载器
java默认的线程上下文类加载器是 系统类加载器(AppClassLoader).
- // Now create the class loader to use to launch the application
- try {
- loader = AppClassLoader.getAppClassLoader(extcl);
- } catch (IOException e) {
- throw new InternalError(
- "Could not create application class loader" );
- }
- // Also set the context class loader for the primordial thread.
- Thread.currentThread().setContextClassLoader(loader);
// Now create the class loader to use to launch the application try { loader = AppClassLoader.getAppClassLoader(extcl); } catch (IOException e) { throw new InternalError( "Could not create application class loader" ); } // Also set the context class loader for the primordial thread. Thread.currentThread().setContextClassLoader(loader);
以上代码摘自sun.misc.Launch的无参构造函数Launch()。
使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类.
典型的例子有, 通过线程上下文来加载第三方库jndi实现, 而不依赖于双亲委派.
大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。
还有一些采用 hotswap 特性的框架, 也使用了线程上下文类加载器, 比如 seasar (full stack framework in japenese).
线程上下文从根本解决了一般应用不能违背双亲委派模式的问题.
使java类加载体系显得更灵活.
随着多核时代的来临, 相信多线程开发将会越来越多地进入程序员的实际编码过程中. 因此,
在编写基础设施时, 通过使用线程上下文来加载类, 应该是一个很好的选择.
当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个,
防止因为不同的类加载器, 导致类型转换异常(ClassCastException).
自定义的类加载器实现
defineClass(String name, byte[] b, int off, int len,ProtectionDomain protectionDomain)
是java.lang.Classloader提供给开发人员, 用来自定义加载class的接口.
使用该接口, 可以动态的加载class文件.
例如,
在jdk中, URLClassLoader是配合findClass方法来使用defineClass, 可以从网络或硬盘上加载class.
而使用类加载接口, 并加上自己的实现逻辑, 还可以定制出更多的高级特性.
比如,
一个简单的hot swap 类加载器实现:
- import java.io.File;
- import java.io.FileInputStream;
- import java.lang.reflect.Method;
- import java.net.URL;
- import java.net.URLClassLoader;
- /**
- * 可以重新载入同名类的类加载器实现
- *
- * 放弃了双亲委派的加载链模式.
- * 需要外部维护重载后的类的成员变量状态.
- *
- * @author ken.wu
- * @mail ken.wug@gmail.com
- * 2007-9-28 下午01:37:43
- */
- public class HotSwapClassLoader extends URLClassLoader {
- public HotSwapClassLoader(URL[] urls) {
- super (urls);
- }
- public HotSwapClassLoader(URL[] urls, ClassLoader parent) {
- super (urls, parent);
- }
- public Class load(String name)
- throws ClassNotFoundException {
- return load(name, false );
- }
- public Class load(String name, boolean resolve)
- throws ClassNotFoundException {
- if ( null != super .findLoadedClass(name))
- return reload(name, resolve);
- Class clazz = super .findClass(name);
- if (resolve)
- super .resolveClass(clazz);
- return clazz;
- }
- public Class reload(String name, boolean resolve)
- throws ClassNotFoundException {
- return new HotSwapClassLoader( super .getURLs(), super .getParent()).load(
- name, resolve);
- }
- }
- public class A {
- private B b;
- public void setB(B b) {
- this .b = b;
- }
- public B getB() {
- return b;
- }
- }
- public class B {}
import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; /** * 可以重新载入同名类的类加载器实现 * * 放弃了双亲委派的加载链模式. * 需要外部维护重载后的类的成员变量状态. * * @author ken.wu * @mail ken.wug@gmail.com * 2007-9-28 下午01:37:43 */ public class HotSwapClassLoader extends URLClassLoader { public HotSwapClassLoader(URL[] urls) { super (urls); } public HotSwapClassLoader(URL[] urls, ClassLoader parent) { super (urls, parent); } public Class load(String name) throws ClassNotFoundException { return load(name, false ); } public Class load(String name, boolean resolve) throws ClassNotFoundException { if ( null != super .findLoadedClass(name)) return reload(name, resolve); Class clazz = super .findClass(name); if (resolve) super .resolveClass(clazz); return clazz; } public Class reload(String name, boolean resolve) throws ClassNotFoundException { return new HotSwapClassLoader( super .getURLs(), super .getParent()).load( name, resolve); } } public class A { private B b; public void setB(B b) { this .b = b; } public B getB() { return b; } } public class B {}
这个类的作用是可以重新载入同名的类, 但是, 为了实现hotswap, 老的对象状态
需要通过其他方式拷贝到重载过的类生成的全新实例中来。(A类中的b实例)
而新实例所依赖的B类如果与老对象不是同一个类加载器加载的, 将会抛出类型转换异常(ClassCastException).
为了解决这种问题, HotSwapClassLoader自定义了load方法. 即当前类是由自身classLoader加载的, 而内部依赖的类
还是老对象的classLoader加载的.
- public class TestHotSwap {
- public static void main(String args[]) {
- A a = new A();
- B b = new B();
- a.setB(b);
- System.out.printf("A classLoader is %s n" , a.getClass().getClassLoader());
- System.out.printf("B classLoader is %s n" , b.getClass().getClassLoader());
- System.out.printf("A.b classLoader is %s n" , a.getB().getClass().getClassLoader());
- HotSwapClassLoader c1 = new HotSwapClassLoader( new URL[]{ new URL( "file:\e:\test\")} , a.getClass().getClassLoader());
- Class clazz = c1.load(" test.hotswap.A ");
- Object aInstance = clazz.newInstance();
- Method method1 = clazz.getMethod(" setB ", B.class);
- method1.invoke(aInstance, b);
- Method method2 = clazz.getMethod(" getB ", null);
- Object bInstance = method2.invoke(aInstance, null);
- System.out.printf(" reloaded A.b classLoader is %s n", bInstance.getClass().getClassLoader());
- }
- }
public class TestHotSwap { public static void main(String args[]) { A a = new A(); B b = new B(); a.setB(b); System.out.printf("A classLoader is %s n" , a.getClass().getClassLoader()); System.out.printf("B classLoader is %s n" , b.getClass().getClassLoader()); System.out.printf("A.b classLoader is %s n" , a.getB().getClass().getClassLoader()); HotSwapClassLoader c1 = new HotSwapClassLoader( new URL[]{ new URL( "file:\e:\test\")} , a.getClass().getClassLoader()); Class clazz = c1.load(" test.hotswap.A "); Object aInstance = clazz.newInstance(); Method method1 = clazz.getMethod(" setB ", B.class); method1.invoke(aInstance, b); Method method2 = clazz.getMethod(" getB ", null); Object bInstance = method2.invoke(aInstance, null); System.out.printf(" reloaded A.b classLoader is %s n", bInstance.getClass().getClassLoader()); } }
输出
A classLoader is sun.misc.Launcher$AppClassLoader@19821f
B classLoader is sun.misc.Launcher$AppClassLoader@19821f
A.b classLoader is sun.misc.Launcher$AppClassLoader@19821f
reloaded A.b classLoader is sun.misc.Launcher$AppClassLoader@19821f
发表评论
-
类的初始化顺序
2010-03-30 09:28 937我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构 ... -
java static 变量
2010-03-30 09:27 1182有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。 ... -
Java中的构造器(构造方法)的调用
2010-03-30 09:21 1395注意:(1)在子类中的 ... -
java学习中重写与重载方法的区别
2010-03-30 09:17 1452重写的主要优点是能 ... -
收集到的java 正则验证
2010-01-12 13:02 1127import java.util.regex.*; ... -
Apache StringUtils api 中文 英文 对
2010-01-08 11:23 3121StringUtils api 中文 英文 对照 ... -
MyEclipse 7.0 Milestone-1破解
2010-01-05 15:36 1415import java.io.Buffered ... -
JDK中的URLConnection参数详解
2009-12-25 14:50 9762009年07月10日 16:52 针对JDK中 ... -
java 中int String类型转换
2009-12-15 17:08 1672int -> String int i=12345;S ... -
@suppresswarnings
2009-12-03 12:02 1605about @SuppressWarnings. 关键字: ... -
JDK动态代理的简单使用示例
2009-11-17 10:00 1112JDK动态代理的简单使用示例: 如有业务类:package ... -
CGlib简单介绍
2009-11-17 09:59 1106CGlib概述:cglib(Code Generation L ... -
java(Web)中相对路径,绝对路径问题
2009-11-12 17:23 11431.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件 ... -
J2EE项目异常处理
2009-10-23 16:12 1003为什么要在J2EE项目 ... -
Java优化编程--核心类与性能 I/O流
2009-10-23 15:34 1672Java 的I/O流给我的感觉 ... -
URLConnection ,获取互联网资源
2009-10-23 15:32 1047这段代码将向你介绍几个比较常见但需要注意的问题: ... -
Java Exception 处理之最佳实践
2009-10-23 15:31 818本文是Exception处理的一篇不错的文章,从Java Ex ... -
java多线程及线程池小结
2009-10-23 15:29 2720最近在学习线程池的东西,前面有篇文章《线程池的设计原则》, ... -
java 异常Exception
2009-10-22 11:26 1171异常处理是程序设计中 ... -
check exception和uncheck exception
2009-10-22 11:15 6214使用Checked Exception还是UnChecked ...
相关推荐
Java的类加载器(ClassLoader)体系结构是JVM(Java虚拟机)中至关重要的一部分,它负责将类的字节码转换为运行时的类实例。本文将深入探讨启动类加载器、扩展类加载器、系统类加载器以及用户自定义类加载器,同时还...
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
kolesar_3cd_01_0716
latchman_01_0108
matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
pimpinella_3cd_01_0716
petrilla_01_0308
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
内容概要:本文档由张卓老师讲解,重点探讨DeepSeek的技术革新及强化学习对未来AI发展的重要性。文章回顾了AI的历史与发展阶段,详细解析Transformer架构在AI上半场所起到的作用,深入介绍了MoE混合专家以及MLA低秩注意机制等技术特点如何帮助DeepSeek在AI中场建立优势,并探讨了当前强化学习的挑战和边界。文档不仅提及AlphaGo和小游戏等成功案例来说明强化学习的强大力量,还提出了关于未来人工通用智能(AGI)的展望,特别是如何利用强化学习提升现有LLMs的能力和性能。 适用人群:本资料适宜对深度学习感兴趣的研究人员、开发者以及想要深入了解人工智能最新进展的专业人士。 使用场景及目标:通过了解最新的AI技术和前沿概念,在实际工作中能够运用更先进的工具和技术解决问题。同时为那些寻求职业转型或者学术深造的人提供了宝贵的参考。 其他说明:文中提到了许多具体的例子和技术细节,如DeepSeek的技术特色、RL的理论背景等等,有助于加深读者对于现代AI系统的理解和认识。
有师傅小程序开源版v2.4.14 新增报价短信奉告 优化部分细节
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
商城二级三级分销系统(小程序+后台含源码).zip
li_3ck_01b_0918
nicholl_3cd_01_0516
媒体关注度是一个衡量公众对某个事件、话题或个体关注程度的重要指标。它主要反映了新闻媒体、社交媒体、博客等对于某一事件、话题或个体的报道和讨论程度。 媒体监督的J-F系数(Janis-Fadner系数)是一种用于测量媒体关注度的指标,特别是用于评估媒体对企业、事件或话题的监督力度。J-F系数基于媒体报道的正面和负面内容来计算,从而为公众、研究者或企业提供一个量化工具,以了解媒体对其关注的方向和强度。 本数据含原始数据、参考文献、代码do文件、最终结果。参考文献中JF系数计算公式。 指标 代码、年份、标题出现该公司的新闻总数、内容出现该公司的新闻总数、正面新闻数全部、中性新闻数全部、负面新闻数全部、正面新闻数原创、中性新闻数原创、负面新闻数原创,媒体监督JF系数。
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
lusted_3cd_02_0716