反射
反射:允许程序在运行期间得到类的内部信息,并能操作对象的属性及方法
反射特点:可以动态的创建和使用对象
获取Class类对象的6种方式:
编译阶段:Class.forName(类的全路径),多用于配置文件读取类信息
类加载阶段:类名.class,多用于参数传递
运行阶段:对象.getClass(),多用于有对象实例
通过类加载器获取到类的Class对象:类加载器.loadClass(类的全路径)
基本数据类型获取类对象:基本数据类型.class
基本数据类型对应的包装类型:包装类.TYPE
哪些类型有Class对象:外部类、内部类、接口、数组、枚举、注解、基本数据类型、void
类加载
静态加载:编译时加载相关的类,依赖性太强
动态加载:运行时加载相关的类
类加载的时机:
1.new对象时
2.main方法执行时
3.调用类的静态成员时
4.通过反射创建对象时(动态加载)
5.子类被加载时
java源文件(.java)--编译--》java字节码文件(.class)--运行--》类加载(3阶段)
类加载后内存的布局情况:类的字节码二进制数据保存到方法区,在堆中生成类的Class对象,类的字节码二进制数据引用类的Class对象
类加载三阶段
加载---->连接(验证、准备、解析)---->初始化
验证:对文件数据的安全性验证
准备:对静态变量进行默认初始化,并分配空间
解析:将符号引用转为直接引用
加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象,此过程由类加载 器完成
连接:将类的二进制数据合并到JRE中
初始化:JVM负责对类进行初始化,这里主要指静态成员