反射
类初始化的时机
所谓的类的出事后,就是讲我们程序员写的java文件编译后的class文件加载到内存中,并未该该class文件生成一个对应的对象,这个过程就是类的初始化;
每个class文件在内存中有且仅有一份由java虚拟机负责创建,程序员只能获取使用,无法手动创建
1、直接使用类的静态成员变量或成员方法;
2、创建一个类的对象;(new)
3、创建一个类的子类对象的时候,父类也会加载
4、使用反射的技术直接强制加载某个类。
5、使用java.exe直接运行一个.class文件时,也会加载者类
反射概述:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任一方法和属性
这种动态获取信息
获取类的文件字节码对象仅有一份,由java虚拟机负责创建,程序员只能获取使用,无法手动创建;
方式1:
格式:Class 变量名 = 数据类型.class;
方式2:
格式:任意Object;类型的对象.getClass();
方式3:
格式:Class.forName("类的全路径名");
反射构造方法:
反射使用步骤:
1、获取字节码文件对象,
2、面向字节码文件对象获取想要的内容(构造,成员方法和属性等)
3、面向获取的内容,直接让获取的内容执行即可。
Class类的关于反射构造方法的方法:
Constructor
当一个类总拥有public权限的空参数的构造方法时,可以直接使用字节码文件对象直接创建对象newInstance
反射私有构造方法--暴力反射(了解)
所有的暴力反射与普通反射之间的方法名中,多了一个Declared单词,反射之后,执行之前,需要忽略权限检查;
setAccessible(boolean),只能传true,忽略权限检查
反射成员方法:
java将反射出来的方法对象,使用Method类来表示
反射成员变量:
由于实际开发,成员变量一般私有,通常通过get和set方法来操作,如果想直接操作属性需要使用暴力反射;
BeanUtils工具类的使用BeanUtils是Apache编写的一套用于数据封装的java工具类;
能将不同数据类型的值封装到指定的java对象中;
可以自动将String类型的数据类型转换成基本数据类型,string数组类型;