乐清 网站建设,网站域名需要购买吗,长沙经济技术开发区人才网,个人服务器网站备案一、类加载机制
1.1类加载过程 类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存#xff0c;并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分#xff0c;负责加载和解析类的字节码#xff0c;将其转换成Java虚拟机中的类对象并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分负责加载和解析类的字节码将其转换成Java虚拟机中的类对象生成加载的类的二进制类数据并存储在方法区中。 类加载过程可以分为以下五个步骤 1. 加载Loading通过类加载器将.class文件字节码读入内存并生成对应的Class对象其中包括编译器编译后的代码、静态常量等信息。 2. 验证Verification检验字节码文件是否符合Java虚拟机规范包括是否有正确的魔数、版本信息、常量池中的常量的数据类型是否正确、操作码是否合法等。 3. 准备Preparation在内存中为类的静态变量分配内存并赋初始值数值类型默认为0对象类型默认为null。这个过程也包括了给类的静态变量赋予正确的默认值。 4. 解析Resolution将类对其他类的引用转换成直接链接检查类或接口是否在系统中被定义将符号引用转变为直接引用。 5. 初始化Initialization执行类的初始化方法包括静态变量赋值和静态块调用等操作即JVM对类进行初始化赋值。如果该类有父类则按继承层次逐级初始化父类。在执行初始化前必须保证该类已经完成了加载、验证、准备和解析过程。 1.2类加载器 类加载器ClassLoader -负责查找、加载、校验字节码的应用程序 java.lang.ClassLoaderload(String className)根据名字加载一个类返回类的实例defineClass((String name,.bytel b,int off,,int len)将一个字节流定义一个类findClass(String name)查找一个类findLoadedClass(String name)在已加载的类中查找一个类成员变量ClassLoader paren Java虚拟机JVM中有四个级别的类加载器分别是 1. 启动类加载器Bootstrap ClassLoader负责加载%JAVA_HOME%/lib目录下的核心类库如rt.jar等。 2. 扩展类加载器Extension ClassLoader负责加载%JAVA_HOME%/lib/ext目录下的扩展类库。 3. 应用程序类加载器Application ClassLoader负责加载应用程序classpath下的类。 4. 自定义类加载器Custom ClassLoader根据开发者的需要定制自己的类加载器。 这四个类加载器按照父子关系依次排列每个类加载器都有自己的加载路径和加载策略。在加载一个类时它会先委托其父加载器进行加载如果父加载器无法加载则由它自己进行加载。如果都无法加载则会抛出ClassNotFoundException异常。这种父子委托的加载方式被称为“双亲委派模型”。 1.3双亲委派机制扩展 Java严格执行双亲委托机制类会由最顶层的加载器来加载如没有才由下级加载器加载委托是单向的确保上层核心的类的正确性但是上级类加载器所加载的类无法访问下级类加载器所加载的类 例如java.lang.String无法访问自定义的一个Test类Java是一个遵循契约设计的程序语言核心类库提供接口应用层提供实现核心类库是BootstrapClassLoader加载应用层是AppClassLoader加载典型例子是JDBC和XML Parser等 补充 1.4ServiceLoader 一个服务提供者会在jar包中有META-INF/services目录里面放一个文件名字同接口名字。内容的每一行都是接口的一个实现类https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.htmlload方法可以用当前线程的类加载器来获取某接口的所有实现当然也都是转为接口类来使用注意此服务和ava9模块系统的服务略有差别但是都能通过ServiceLoader:进行加载 1.5自定义类加载路径 自定义加载路径弥补类搜索路径静态的不足前3个加载的路径都是运行前确定的 Java提供URLClassLoader 程序运行时修改类的加载路径可从多个来源中加载类 1.6自定义类加载器 JVM四级类加载器严格遵循从上到下的加载机制自定义类加载器继承ClassLoader类可重写loadClass和findClass方法不同层次的类加载器加载同名的类在JVM里面也算两个