反射介绍:
1.框架设计的灵魂
2.框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
3.将类的各个组成部分封装为其它对象,这就是反射机制
java代码经历的三个阶段:Source(源代码阶段)--类加载器-->Class类对象阶段--创建对象-->Runtime(运行时阶段)
好处:1.在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性
获取Class对象的方式:
1.Class.forName("全类名");将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中,读取文件,加载类。
2.类名.class:通过类名的属性class获取
多用于参数传递
3.对象.getClass():getClass()方法是Object类的方法
多用于对象获取字节码文件
结论:同一个字节码文件(*.class)在一次程序的运行过程中,只会被加载一次,
不论通过哪种方式获取的Class对象都是同一个
暴力反射:setAccessible(true);
eg:如果想要访问私有的成员变量,那么就要:
1.先使用Class类对象.getDeclaredField("成员变量名");获取该成员变量的Field对象
2.因为私有的成员变量值不能直接获取或设置,因此要使用暴力反射
3.Field对象.setAccessible(true);就可以无视权限修饰符
4.最后使用Filed对象的get(Object o)方法获取值,使用set(Object o,Object o)方法设置值
Java中是不提倡使用反射的,因为不安全
使用类对象访问成员变量:
1. 获取成员变量们
* Field[] getFields() :获取所有public修饰的成员变量
* Field getField(String name) 获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
使用类对象创建实例对象:
1.通过Class类对象中的方法获取指定的构造器对象Constructor
2.调用构造器中的newInstance()方法创建对象,返回值是Object;
注意:
1.newInstance()方法中的参数是可变参数,这种可变依赖于不同的构造方法的参数列表的不同
2.获取的是哪个构造方法的Constructor对象,那么使用newInstance()方法创建对象时必须传入与该
构造方法对应的参数列表,否则报IllegalArgumentException异常
3.如果想要使用私有的构造方法创建对象,只能先通过getDeclaredConstructor()获取指定的私有构造方法的构造器对象
然后使用暴力反射,最后调用newInstance方法获取对象
使用类对象调用类的成员方法:
1.获取指定的方法,返回该方法的Method对象
2.通过控制getMethod的参数,来控制获取的Method的对象的不同
3.getMethod的参数:(方法名,该方法的形参列表的每一个变量的数据类型.class),这样可以区别重载的方法
4.调用Method类的invoke方法,执行该方法
5.invoke方法需要传递的参数为:要执行的方法所在类的对象,调用该方法需要的实际参数
6.如果invoke方法中传递的实际参数与获取Method对象调用getMethod方法传递的参数列表不对应,就会报IllegalArgumentException异常
获取全类名:
* String getName()