前言:
当前你们对“java的类加载器”大体比较关怀,小伙伴们都想要分析一些“java的类加载器”的相关资讯。那么小编在网络上搜集了一些对于“java的类加载器””的相关资讯,希望姐妹们能喜欢,同学们快快来了解一下吧!1.什么是类加载器?
类加载器就是将类的描述加载到虚拟机内处于的这样一个模块:典型的类的描述就是java源码编译后的class文件,也可以是其他数据形式,例如网络字节流等。
2.类加载器有哪些?
java默认地定义了三种类加载器和自定义的加载器
* 启动类加载器主要是加载jre/lib目录下的jar包
* 扩展类加载器主要是加载jre/lib/ext目录下的jar包
* 应用类加载器主要是加载classpath下面内容
* 自定义类加载器,实际上自定义加载器是默认应用加载器的父类
3.什么是双亲委派模型?
当类加载器去加载某个类的时候。先有父加载器通过自己的加载搜索路径去加载类,如果没有找到该类,就交给子类加载器去加载,自顶向下的加载方式。
4.为什么要用双亲委派机制?
* 避免重复加载类
* 沙箱安全机制,防止篡改底层实现的API被篡改
5.有哪些打破了双亲委派机制,为什么打破?
* Tomcat服务器
这个场景打破双亲委派机制的原因就是父类没有能力加载或者完成一些逻辑,为了整体的架构设计更加灵活优雅,便交给子类加载器来进行加载。
6.类加载的过程?
类加载的过程主要是分为三部分
1.加载:根据类的名称找到class文件加载到JVM内存中
2.链接:链接分为三个部分
* 验证 验证Class文件是否符合虚拟机的规范
* 准备 创建类的静态变量并准备到内存空间中,主要是在方法区上
* 解析 将常量池中的复合引用修改成直接引用
3.初始化:给类的静态变量或者静态的方法分配内存并且初始化的操作
小知识点:符号引用的作用?
符号引用的作用就是描述所引用的目标,主要是解决以下的问题:java编译器在将java代码编译成字节码时,并不知道相关的变量和方法在内存中的地址,不能编译成直接引用,所以用符号引用,当相关的变量或者方法被虚拟机执行时,会将符号引用解析成直接引用。
7.自定义类加载器的哪些应用的场景?
* 修改类的字节码的逻辑 例如:为外部类统一的设定统一的逻辑
* 根据用户的需求,需要动态的创建类 例如:JDK动态代理,JDBC的驱动类等
* 包名+类名有冲突的时候,一个类加载不能同时加载,可以用不同的类加载器加载到内存中
* 需要热加载的需要,通过自定义类加载器实现在运行过程中动态的加载和卸载
8.自定义类加载器的实现
主要核心在于获取类的字节码阶段做处理,将修改后的字节码映射成Class对象
继承ClassLoader
重写方法:findClass()
根据类的路径获取字节码数组 Byte[] b = loadClassFromFileName(name)
标签: #java的类加载器