反射
类的加载机制
-
jvm 和 类
- 运行带有java主方法的类(main)
- 启动jvm去加载字节码
- 程序何时结束:
- 程序正常结束
- 出现异常,没有捕获异常
- System.exit()方法
- 强制杀进程
- **重点:**jvm进程结束,进程中的所有内存数据丢失。
-
加载机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7CCRHd2-1653839171053)(http://i1.go2yd.com/image.php?url=0MA6WvUbsE)]
-
初始化操作:
- 加载类:class文件(字节码文件)载入内存里面,创建一个字节码对象,类加载使用类加载器(ClassLoader,由jvm提供)
- 连接:字节码加载进内存后,jvm会生成一个class对象,把类中的二进制数据提供给jre
- 验证:验证加载的内是否有正确的结构
- 准备:类里面有常量,需要分配内存地址,并且提供默认值
- 解析:类里面的二进制数据的符号的引用替换成直接引用
- 符号引用:Class文件中(CONSTANCE_CLASS_INFO, )
- 直接引用:直接指向目标指针,相对偏移量
- 初始化:jvm负责对类进行初始化,static
- 如果类没有被加载,则优先加载,并建立连接
- 直接父类没有加载,先加载父类
- 静态代码块优先执行,
反射概述
-
问题:Object obj = new String(“abc”);
- 需求:调用String中的length()方法
- 使用强制类型转换
- 不知道真实类型如何解决?
- 需求:调用String中的length()方法
-
问题:一切皆对象(类属于什么对象?方法属于什么对象?字段属于什么对象?)
- Class 表示所有类
- Method 表示所有的方法
- Filed 表示所有的字段
- Constructor 表示所有的构造器
Class类和Class实例
-
Class表示所有的类
-
Class实例:一份份的字节码(类,接口,枚举,注解)
-
各种类型如何表示?
- String: Class<java.lang.String>
- HashMap: Class<java.util.HashMap>
-
如何获取一个字节码Class对象?
-
//直接使用class类 Class<String> Class1 = String.class; //对象形式 Object obj = new String("abc"); Class<?> Class2 = obj.getClass(); //知道类的全限定类名 java.lang.String Class<?> Class3 = Class.forName("java.lang.String");
-
重点:同一个jvm中,只存在一个类的一份字节码问价你和一份字节码对象
-
使用最多的就是Class.forName(“类的全限定名”);
-
基本数据类型的字节码如何表示?
-
jvm里面已经提前内置好了基本数据类型的实例
-
//基本类型的字节码 Class<Integer> integerClass = int.class; Class<Long> longClass = long.class;
-
包装类型里面提供了一个TYPE常量去获取基本数据类型的类实例
public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
-
使用字节码对象证明 int 和Integer不是同一类型
Class<Integer> integerClass2 = int.class; Class<Integer> integerClass3 = Integer.class; System.out.println(integerClass2==integerClass3);//false
-
-
-
类的加载,超重要!!!
1,直接使用类.class