栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM学习2: 类加载器基础 下

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM学习2: 类加载器基础 下

类加载器

JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。

自定义类加载器一般指程序中由开发者编写的类加载器,但是JVM规范的定义是所有派生于抽象类ClassLoader的类加载器都是自定义类加载器。

获取类加载器示例
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);

ClassLoader classLoaderParent = systemClassLoader.getParent();
System.out.println(classLoaderParent);

ClassLoader parentParent = classLoaderParent.getParent();
System.out.println(parentParent);

ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
System.out.println(classLoader);

ClassLoader loader = String.class.getClassLoader();
System.out.println(loader);
引导类加载器 - Bootstrap ClassLoader

使用C/C++编写,在JVM内部。

用来加载Java的核心类库,JAVA_HOME/jer/lib/rt.jar、resources.jar或sun.boot.class.path下面的内容,用于提供JVM自身需要的类。

不继承java.lang.ClassLoader类。

加载扩展类和应用程序类加载器,并指定为他们的父类加载器。

引导类加载器只加载包名为java、javax、sun开始的类。

扩展类加载器 - Extension ClassLoader

Java编写,sun.misc.Launcher$ExtClassLoader实现。

继承java.lang.ClassLoader类。

从java.ext.dirs所指定的目录加载类库,或从JDK的安装目录的jre/lib/ext子目录加载类库,如果用户创建的JAR放在此目录下,也会自动加载。

应用程序类加载器 - AppClassLoader

Java编写,sun.misc.Launcher$AppClassLoader实现。

继承java.lang.ClassLoader类。

加载环境变量classpath或java.class.path指定目录下面的类库。

是程序默认的类加载器,一般Java应用的类都是由这个类加载器加载。

通过ClassLoader.getSystemClassLoader()可以获取到这个类加载器。

自定义类加载器
  • 隔离加载类
  • 修改类加载方式
  • 扩展加载源
  • 防止源码泄漏

自定义类加载器步骤:

  • 编写类继承ClassLoader类
  • 将自定义的类加载逻辑写在findClass方法里面
双亲委派机制

Java虚拟机对class文件使用的是按需加载方式,也就是说当需要使用这个类时才将他的class文件加载到内存生成Class对象,而且加载某个类时,Java虚拟机使用的是双亲委派模式,即把请求交由父加载器处理,父加载器没有找到时才自己加载。

如果一个类加载器收到了类加载请求,并不会自己去加载,而是把这个请求委托给父加载器执行。

如果父加载器还存在父加载器,则进一步向上委托,最终达到引导类加载器。

如果父加载器可以完成类加载,就成功返回,如果父加载器无法完成加载,子加载器才会尝试自己去加载,这就是双亲委派机制。

  • 可以避免类的重复加载
  • 保护程序安全,防止核心API被篡改
判断Class相等

在JVM中表示两个Class对是否是同一个类存在两个条件:

  • 类的全限定名需要一致
  • 加载器一致

即使两个Class对象来自相同的class文件,被同一个虚拟机加载,但是只要他们的ClassLoader实例对象不同,那么这两个Class对象就是不相等的。

类的主动使用和被动使用 主动使用
  • 创建类实例
  • 访问某个类或接口的静态变量或者为静态变量赋值
  • 调用类静态方法
  • 反射,Class.forName("")方法
  • 初始化一个类的子类
  • Java虚拟机启动时被标识为启动类的类
  • JDK 7开始提供的动态语言支持
被动使用

其余的使用方式都是被动使用。

被动使用不会导致类的初始化。

  • 反射,Class.forName("")方法
  • 初始化一个类的子类
  • Java虚拟机启动时被标识为启动类的类
  • JDK 7开始提供的动态语言支持
被动使用

其余的使用方式都是被动使用。

被动使用不会导致类的初始化。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397187.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号