天道酬勤,学无止境

类加载

Java虚拟机详解(十)------类加载过程

Java虚拟机详解(十)------类加载过程  在上一篇文章中,我们详细的介绍了Java类文件结构,那么这些Class文件是如何被加载到内存,由虚拟机来直接使用的呢?这就是本篇博客将要介绍的——类加载过程。1、类的生命周期  类从被加载到虚拟机内存开始,到卸载出内存为止,其声明周期流程如下:    上图中红色的5个部分(加载、验证、准备、初始化、卸载)顺序是确定的,也就是说,类的加载过程必须按照这种顺序按部就班的开始。这里的“开始”不是按部就班的“进行”或者“完成”,因为这些阶段通常是互相交叉混合的进行的,通常会在一个阶段执行过程中调用另一个阶段。2、加载  “加载”阶段是“类加载”生命周期的第一个阶段。在加载阶段,虚拟机要完成下面三件事:  ①、通过一个类的全限定名来获取定义此类的二进制字节流。  ②、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。  ③、在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。  PS:类的全限定名可以理解为这个类存放的绝对路径。方法区是JDK1.7以前定义的运行时数据区,而在JDK1.8以后改为元数据区(Metaspace),主要用于存放被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。详情可以参考这边该系列的第二篇文章——运行时内存结构。  另外

2021-05-18 19:50:49    分类:博客    Java虚拟机   类加载

Java反射获取类和对象信息概念解析

反射可以解决在编译时无法预知对象和类是属于那个类的,要根据程序运行时的信息才能知道该对象和类的信息的问题。 在两个人协作开发时,你只要知道对方的类名就可以进行初步的开发了。 获取类对象 Class.forName(String clazzName)静态方法 调用类的class属性,Person.class返回的就是Person的class对象(推荐使用) 调用某个对象的getClass()方法 具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的校验,第二种、第三种则会做校验 获取类的信息 获取类构造器Connstructor getConstructor(Class...parameterTypes):返回此Class对象对应类的带指定形参的public构造器 Constructor[] getConstructors():返回此Class对象对应类的所有public构造器 Constructor[] getDeclaredConstructor(Class...parameterTypes):返回此class对象对应类的带指定参数的构造器,与构造器的访问权限无关 Constructor[] getDeclaredConstructors():返回此class对象对应类的所有构造器,与构造器的访问权限无关

2021-05-12 09:31:13    分类:博客    java   反射   类加载   java

话说 类加载过程 第一篇

1. 类加载初始化 Loading 把一个class文件加载到内存 Linking Verification 校验class文件符不符合class文件标准 Preparation 静态变量赋默认值 static int count = 10; 在这一步count = 0 默认值 Resolution 符号引用转换为内存地址 可以直接访问的地址 Initializing 静态变量赋值为初始值 2. 类加载器 1. JVM是按需动态加载采用双亲委派机制 用getClassLoader获取类加载器 如果是Null 那就是到了BootStrap类加载器 了 因为是C++实现的 木有对应类 我们平时写的类 就再classpath下 所以是由App类加载器加载的 注意: 这四个类加载器没有继承关系 只是顺序关系 ​ 父加载器不是父类,只是说自己加载不了了,就交给上一级加载 ​ 他们不是继承关系 那是怎么产生联系? 用组合啦~~ 2. 步骤1图是不是不能说明双亲委派? 我给你一张图 让你明白一下双亲委派 不 ! 我为什么要用图? 我先用一句话描述:classLoader在自己的cache缓存中找是不是已经加载过类XX,如果没有就找他的父类加载器,父类加载器在自己的cache缓存中找是不是已经加载过类XX,找到就返回,找不到就接着找父类加载器,直到BootStrap 如果最后还没在cache中找到

2021-03-27 01:16:32    分类:博客    java   类加载

话说 类加载过程 第一篇

1. 类加载初始化 Loading 把一个class文件加载到内存 Linking Verification 校验class文件符不符合class文件标准 Preparation 静态变量赋默认值 static int count = 10; 在这一步count = 0 默认值 Resolution 符号引用转换为内存地址 可以直接访问的地址 Initializing 静态变量赋值为初始值 2. 类加载器 1. JVM是按需动态加载采用双亲委派机制 用getClassLoader获取类加载器 如果是Null 那就是到了BootStrap类加载器 了 因为是C++实现的 木有对应类 我们平时写的类 就再classpath下 所以是由App类加载器加载的 注意: 这四个类加载器没有继承关系 只是顺序关系 ​ 父加载器不是父类,只是说自己加载不了了,就交给上一级加载 ​ 他们不是继承关系 那是怎么产生联系? 用组合啦~~ 2. 步骤1图是不是不能说明双亲委派? 我给你一张图 让你明白一下双亲委派 不 ! 我为什么要用图? 我先用一句话描述:classLoader在自己的cache缓存中找是不是已经加载过类XX,如果没有就找他的父类加载器,父类加载器在自己的cache缓存中找是不是已经加载过类XX,找到就返回,找不到就接着找父类加载器,直到BootStrap 如果最后还没在cache中找到

2021-03-27 01:16:30    分类:博客    java   类加载