一、先看看编写出的代码的执行过程:
二、研究类加载机制的意义
从上图可以看出,类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行。
研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性。
三、类加载的一般过程
原理:双亲委托模式
1、寻找jre目录,寻找jvm.dll,并初始化JVM;
2、产生一个Bootstrap Loader(启动类加载器);
3、Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为Bootstrap Loader。
4、Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为Extended Loader。
5、最后由AppClass Loader加载HelloWorld类。
四、类加载器的特点
1、运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。
2、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。
3、Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
五、类加载器的获取
很容易,看下面例子
public class HelloWorld {
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
Class c = hello.getClass();
ClassLoader loader = c.getClassLoader();
System.out.println(loader);
System.out.println(loader.getParent());
System.out.println(loader.getParent().getParent());
}
}
打印结果:
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
从上面的结果可以看出,并没有获取到ExtClassLoader的父Loader,原因是Bootstrap Loader(启动类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式,于是就返回null。
六、类的加载
类加载有三种方式:
1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载
三种方式区别比较大,看个例子就明白了:
package zhongqiu.common.base;
public class ClassLoadDemo {
static {
System.out.println("ClassLoadDemo静态初始化块执行了!");
}
public static void main(String[] args) throws ClassNotFoundException {
ClassLoader loader2 = ClassLoadDemo.class.getClassLoader();
System.out.println(loader2);
// 使用ClassLoader.loadClass()来加载类,不会执行初始化块
// loader2.loadClass("zhongqiu.test.Test");
// 使用Class.forName()来加载类,默认会执行初始化块
// Class.forName("zhongqiu.test.Test");
// 使用Class.forName()来加载类,并指定ClassLoader,初始化时不执行静态块
Class.forName("zhongqiu.test.Test", false, loader2);
}
}
七、自定义ClassLoader
package zhongqiu.common.base.classload;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader {
@SuppressWarnings("resource")
public static void main(String[] args)
throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
URL url = new URL("file:/D:/javaworkspace/JavaCommon/src/");
ClassLoader myloader = new URLClassLoader(new URL[] { url });
Class c = myloader.loadClass("zhongqiu.common.base.classload.Test");
Test t3 = (Test) c.newInstance();
}
}
在Java.lang包里有个ClassLoader类,ClassLoader 的基本目标是对类的请求提供服务,按需动态装载类和资源,只有当一个类要使用(使用new 关键字来实例化一个类)的时候,类加载器才会加载这个类并初始化。一个Java应用程序可以使用不同类型的类加载器。例如Web Application Server中,Servlet的加载使用开发商自定义的类加载器, java.lang.String在使用JVM系统加载器,Bootstrap Class Loader,开发商定义的其他类则由AppClassLoader加载。在JVM里由类名和类加载器区别不同的Java类型。因此,JVM允许我们使用不同的加载器加载相同namespace的java类,而实际上这些相同namespace的java类可以是完全不同的类。这种机制可以保证JDK自带的java.lang.String是唯一的。
八、为什么要使用这种双亲委托模式呢?
因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的ClassLoader。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# jvm
# 类加载
# JVM类加载机制
# 详解JVM类加载机制及类缓存问题的处理方法
# JVM类加载机制原理及用法解析
# 一文读懂Jvm类加载机制
# 深入理解JVM之类加载机制详解
# 通俗讲解JVM的类加载机制
# java虚拟机JVM类加载机制原理(面试必问)
# 面试必时必问的JVM 类加载机制详解
# 一篇文章弄懂JVM类加载机制过程以及原理
# 加载
# 自定义
# 其父
# 找不到
# 设为
# 并将
# 可以看出
# 要使
# 自动加载
# 有个
# 是由
# 才会
# 很容易
# 就没
# 第二个
# 三种
# 考虑到
# 这种情况
# 就可
# 有必要
相关文章:
外贸公司网站制作哪家好,maersk船公司官网?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
小型网站建站如何选择虚拟主机?
C#怎么创建控制台应用 C# Console App项目创建方法
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何在Windows环境下新建FTP站点并设置权限?
如何选择网络建站服务器?高效建站必看指南
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何用美橙互联一键搭建多站合一网站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何选购建站域名与空间?自助平台全解析
淘宝制作网站有哪些,淘宝网官网主页?
清除minerd进程的简单方法
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
北京建设网站制作公司,北京古代建筑博物馆预约官网?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
一键网站制作软件,义乌购一件代发流程?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
宝塔建站助手安装配置与建站模板使用全流程解析
如何通过cPanel快速搭建网站?
Android使用GridView实现日历的简单功能
广州美橙建站如何快速搭建多端合一网站?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何设置并定期更换建站之星安全管理员密码?
已有域名能否直接搭建网站?
建站VPS选购需注意哪些关键参数?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
网站制作壁纸教程视频,电脑壁纸网站?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站之星安装路径如何正确选择及配置?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何在腾讯云服务器快速搭建个人网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
制作公司内部网站有哪些,内网如何建网站?
购物网站制作公司有哪些,哪个购物网站比较好?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
c# await 一个已经完成的Task会发生什么
魔方云NAT建站如何实现端口转发?
建站之星云端配置指南:模板选择与SEO优化一键生成
建站三合一如何选?哪家性价比更高?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
制作网站公司那家好,网络公司是做什么的?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在宝塔面板中修改默认建站目录?
php json中文编码为null的解决办法
小建面朝正北,A点实际方位是否存在偏差?
建站之星安装模板失败:服务器环境不兼容?
*请认真填写需求信息,我们会在24小时内与您取得联系。