博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 类加载机制总结
阅读量:6413 次
发布时间:2019-06-23

本文共 1206 字,大约阅读时间需要 4 分钟。

  Java程序的运行,离不开class的加载,所谓类加载就是将编译好的class文件加载的jvm并形成class对象,只有class正确加载才能被实例化和调用。

  

public class test {    public static void main(String[] args) {        System.out.println(new test().getClass().getClassLoader());        System.out.println(new test().getClass().getClassLoader().getParent());        System.out.println(new test().getClass().getClassLoader().getParent().getParent());    }}

  调用此方法会显示如下结果:

  sun.misc.Launcher$AppClassLoader@232204a1

  sun.misc.Launcher$ExtClassLoader@74a14482
  null

  最后一个null是因为这个加载器是由c++方法实现的,所以在代码中获取不到这个类,除了这个有c++实现的类加载之外,其他的类加载器都有parent加载器,基本上呈树形结构,类加载的时候为了尽量保证calss所有的classloader只加载一次,加载时会先从appClassLoader加载,如果加载不到再从ExtClassLoader加载。从上到下,第一个加载类用于加载我们平常自己写的类和classPath中引入的jar,第二个加载类用于加载jdk中的一些扩展类,工具类等。第三个c++实现的加载类用于加载java规范定义的接口和实现,也就是在我们在path中配置的rt.jar文件

  在实际应用中我们也可以自定义自己的classLoader,主要继承classLoder这个类就可以,classLoder接口中有一些主要方法:

  loadClass ,此方法用来返回已经加载到jvm的class,如果没有则调用findClass加载,如果没有在整个加载过程中都没有加载上则会抛出classNotFoundException

  findClass,此方法用来加载class到jvm,如果自定义加载方式的话主要就是重写这个方法

  findSystemClass,此方法调用ExtClassLoader加载类,加载不到就继续调用c++实现的那个加载器来加载。

  dfineClass,此方法用于将二进制文件转化为class对象,也是类加载过程是十分重要的一个方法

   

  

转载于:https://www.cnblogs.com/chengxiansheng/p/6017924.html

你可能感兴趣的文章
linux下端口转发工具
查看>>
spring 中实现文件上传
查看>>
JAVA调用lp_solve配置详解
查看>>
BMP文件格式详解(BMP file format)
查看>>
25. [Microsoft][ODBC SQL Server Driver][DBNETLI...
查看>>
android开发过程中遇到错误的笔记
查看>>
JS实现继承的几种方式
查看>>
Spring MVC 4.x + fastjson 1.2.7,封装的List<?>参数
查看>>
svn培训
查看>>
js选中问题
查看>>
CentOS 7 Shell脚本编程第二讲 Shell 脚本创建和执行
查看>>
protobuf
查看>>
4.Java基础复习--Set
查看>>
七:Mysql的乐观锁与悲观锁机制
查看>>
CSS滤镜及渐变 (filter样式表属性)
查看>>
调用上面的@InitBinder 解决客户端上传时间参数转换的问题
查看>>
net.sf.json.JSONException: There is a cycle in the hierarchy异常,解决方法
查看>>
OpenStack centos版安装(二)
查看>>
Tomcat虚拟根目录与虚拟子目录
查看>>
Fragment提交transaction导致state loss异常
查看>>