县总工会网站建设情况介绍,手机膜 东莞网站建设,做旅游攻略的网站好,西安网站开发公司电话点击下方关注我#xff0c;然后右上角点击...“设为星标”#xff0c;就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的#xff0c;类文件又是如何加载到虚拟机的#xff0c;类加载有哪些机制和原则呢#xff1f;本文将为大家一一介绍。 1 Java 源码形成类文件… 点击下方关注我然后右上角点击...“设为星标”就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的类文件又是如何加载到虚拟机的类加载有哪些机制和原则呢本文将为大家一一介绍。 1 Java 源码形成类文件 1、Helloworld.java 形成 HelloWorld.class 的过程 package jvm;
public class HelloWorld {
public static void main(String[] args) {System.out.println(HelloWorld);}
} 编译操作javac Helloworld.java --- Helloworld.class 命令行编译javac 命令、运行java 命令效果图 查看类文件的字节码javap 命令 HelloWorld.java 编译过程 HelloWorld.java --- 词法分析 --- token 集合 --- 语法分析 --- 语法树/抽象语法树 --- 语义分析 --- 注解抽象语法树 --- 字节码生成 --- HelloWorld.class文件 2 类文件加载到虚拟机类加载机制 1、类使用的生命周期 类从被加载到虚拟机内存中开始直到卸载出内存为止它的整个生命周期包括 7 个阶段加载、验证、准备、解析、初始化、使用和卸载。类加载主要是前 5 个阶段。 加载(Load)查找和导入 class 文件 链接(Link)包括验证、准备和解析三个阶段。 1. 验证(Verify)保证被加载类的正确性包括文件格式验证元数据验证是否符合Java语法规范字节码验证确保不会危害虚拟机安全符号引用验证等。 2. 准备(Prepare)为类的静态变量分配内存并将其初始化为默认值。 3. 解析(Resolve)把类中的符号引用转换为直接引用包括类或接口的解析变量的解析等。 初始化(Initialize)是类加载过程的最后一步对类的静态变量静态代码块执行初始化操作。 3 类加载器以及类加载原则 1、类加载器 启动类加载器BootStrap ClassLoader加载 jdk 的核心类库启动类加载器 Java 代码获取不到 扩展类加载器Extension ClassLoader加载 jre/lib/ext 目录下的类 应用程序类加载器App ClassLoader加载自定义应用程序类和普通 jar 包 自定义类加载器Custom ClassLoader应用程序可以继承 java.lang.ClassLoader类的方式重写它的 findClass 方法实现自己的类加载器以满足一些特殊的要求比如把自己的代码进行加密以防止反编译。 2、JVM 的类加载时机 1、创建类的实例也就是new一个对象的时候 2、访问某个类或接口的静态变量或者对该静态变量赋值的时候 3、调用类的静态方法 4、反射 Class.forName(jvm.HelloWorld) 3、JVM 的类加载机制 全盘负责机制当一个类加载器负责加载某个类时该类所依赖和引用的其他类也将由该类加载器负责加载除非显示使用另外一个类加载器来加载。 双亲委派机制双亲委派就是如果一个类加载器在接到加载类的请求时它首先不会自己尝试去加载这个类而是把 这个请求任务委托给父类加载器去完成依次递归如果父类加载器可以完成类的加载就成功返回只有父类加载器无法完成加载时才自己去加载。双亲委派机制的优势是可以保证 Java 核心类库的类型安全比如 Java中的 Object 类它存放在 rt.jar 之中无论哪一个类加载器要加载这个类最终都是委派给处于模型最顶端的启动类加载器进行加载因此 Object 在各种类加载环境中都是同一个类也就是保证了用户不能自己定义 java.lang.Object 类的情况。 缓存机制保证所有加载过的类都会被缓存当程序中需要使用某个类时类加载器先从缓存区中获取该类只有当缓存区中不存在该类的对象时系统才会读取该类对应的二进制数据并将其转换成类对象存入缓冲区中。这就是为什么修改了代码后必须重新启动才会生效的原因。 4、类加载的原则 检查某个类是否已经加载的顺序是自底向上从Custom ClassLoader 到 BootStrap ClassLoader 逐层检查只要某个 Classloader 已加载就视为已加载此类保证此类只加载一次类加载的顺序是自顶向下也就是从上到下由上层来逐层尝试加载类。 后面将为大家介绍运行时数据区的知识。