JVM学习笔记一 之 ClassLoader

5 篇文章 0 订阅

一、.类加载器所做的工作实质上是把类文件从硬盘读取到内存中

二、java的类大致分三中:系统类、扩展类、自定义类

三、类加载方法两种

       1.隐式装载,程序在运行过程中碰到new等方式生成对象时,隐式调用类加载器加载对应的类到JVM中

        2.显示装载,通过class.forName()等方法,显示加载需要的类

四、类加载有3种:bootstrap-ClassLoader、ext-ClassLoader、application-ClassLoader

       1.bootstrap-ClassLoader:负责加载系统类,路径放在JAVA_HOME/LIB/rt.jar下.该部分用C++写,所以所以 返回的null。此类加载器并不继承于java.lang.ClassLoader。是虚拟 机自身的一部分.不能被java程序直接调用

        2.ext-ClassLoader:负责加载系统扩展类,路径放在JAVA_HOME/LIB/EXT下

        3.applicationL-ClassLoarder:负责加载应用程序的类。

       4.我们还可以加入自己定义的类加载器,以满足特殊的需求,需要继承java.lang.ClassLoader类.重写ClassLoader的findClass方法(defineClass、loadClass方法,直接调用父类的方法)。ClassLoader采用了模板设计模式

备注:java采用了委托模型机制(双亲委派模型)

        除非显示使用另一个ClassLoader, 就是如果要加载某个类,那么会委托父加载器去加载,如果父加载器搜素不到类路径,才用自己的类加载器去加载。好处:安全,比如 系统自带的类(String.object),直接委托bootstrap-ClassLoader加载,这样可以防止恶意修改Object

      application-ClassLoader<ext-ClassLoader< bootstrap-ClassLoader(子-父)

五、装载类到JVM的步骤
1、装载:查找和导入class文件
2、链接:把类的二进制数据合并到JRE中
1)检查:检查载入的class文件数据的正确性
2)准备:给类的静态变量分配存储空间、正式为类变量分配并设置类变量初始值的阶段(就是默认基本类型的初始化值,比如int的初始值0)
3)解析:虚拟机将常量池内的符号引用替换成直接引用
3、初始化:对静态变量,静态代码块执行初始化

六、Java类加载器基于三个机制:委托、可见性和单一性

       委托机制:当前加载器的父加载器去加载

        例子:比如有个A.class。由app-ClassLoader委托extension-ClassLoader加载,extension-ClassLoader委托bootstrap-ClassLoader加载,bootstrap-ClassLoader在JAVA_HOME/LIB/rt.jar下找A.class,结果没找到,那么extension-ClassLoader去相应的路径去找,结果没找到,app-ClassLoader去classpath找,结果找到了,然后加载

      可见性:子类加载器可以看到父类加载器加载的类,而反之则不行

    单一性机制:

七、如何显式的加载类

  Java提供了显式加载类的API:Class.forName(classname)和Class.forName(classname, initialized, classloader)。就像上面的例子中,你可以指定类加载器的名称以及要加载的类的名称。类的加载是通过调用java.lang.ClassLoader的loadClass()方法,而loadClass()方法则调用了findClass()方法来定位相应类的字节码。在这个例子中Extension类加载器使用了java.net.URLClassLoader,它从JAR和目录中进行查找类文件,所有以”/”结尾的查找路径被认为是目录。如果findClass()没有找到那么它会抛出java.lang.ClassNotFoundException异常,而如果找到的话则会调用defineClass()将字节码转化成类实例,然后返回。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值