一、反射的使用:
反射就是通过调用java的字节码文件(字节码是在编译时候就会产生,并且是属于java虚拟机“看的文件”)进行操作。
二、好处:
不用死板操作.java文件,同时配合给定的配置文件就可以对程序进行操作。而不需要改动代码。
利用反射调用它类中的属性和方法时,无视修饰符。
使用反射创建对象,代码更复杂,功能更强大灵活。
三、应用场景:
idea的智能提示,是框架 Spring、SpringMVC、Mybatis 等的底层原理等等
四、反射的创建:三种创建方式
1.通过类名创建。 类名.class
2.通过对象名 使用getClass()方法创建。 对象.getClass()
3.通过使用forName方法创建。 Class.forName("类全名")
五、反射对类中各个属性方法的使用:
成员变量Field(Field[ ])、成员方法Method(Method[ ])、构造方法Construction(Construction[ ])
六、反射获取构造方法(构造器)
1.Constructor<?>[ ] getConstructors():返回public修饰的所有构造方法对象的数组(也会获取父类的)
2.Constructor<T> getConstructor(Class<?>... parameterTypes):返回public修饰的单个构造方法对象
Declared(声明,即为自己定义的)parameter(变量)
3.Constructor<?>[ ] getDeclaredConstructors():返回任意权限的所有构造方法对象的数组
4.Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):返回任意权限的单个构造方法对象
简单记忆:有加上s的为复数,就不用加上参数(没有加s就是特定的某一个,那就有参数加参数),有加上声明的就是自己定义的就能获取全部类型的构造方法(不管是public还是private)。
注:要获取私有的还要讲这个构造方法设置为setAccessible(true),设置为true 表示允许对私有权限的访问
newInstance(Object... initargs):根据指定的构造方法创建对象
不过构造器通常不会设置为私有,因为构造器使用创建对象用的,基本上都是public的。这里的说明跟方法(Method)一样适用。
七、反射获取成员方法
Method[ ] getMethods():返回所有public的成员方法对象的数组,包括继承的。
Method getMethod(String name, Class<?>... parameterTypes) :返回单个public的成员方法对象。
参数name:表示方法名 ;参数parameterTypes:表示方法的形参类型
Method[ ] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
Method getDeclaredMethod(String name, Class<?>... parameterTypes):返回单个成员方法对象。
具体说明跟上面一样。
八、反射获取成员变量
Field getField(String name):返回单个公共成员变量对象
Field[ ] getFields():返回所有公共成员变量对象的数组,包括继承的public成员变量
Field getDeclaredField(String name):返回单个成员变量对象
Field[ ] getDeclaredFields():返回所有本类成员变量对象的数组。不包括继承的
void set(Object obj, Object value):赋值。参数obj为成员变量所在的对象,参数value为成员变量的值
Object get(Object obj) :获取值。参数obj为成员变量所在的对象
九、其他补充
Class类中的方法:
String getSimpleName(): 获得类名
String getName(): 获得类全名:包名+类名
十、综合运用案例
部分代码说明:
1.这里没有进行try.....catch处理异常,先跑出去了
2.这里通过属性集配合配置文件进行操作。(通过属性集跟IO流的操作,获取配置文件里面给定的数据)
3.这个代码演示的是通过配置文件执行方法(即修改配置文件不需要修改代码,当然这里是最简单的演示,还是有需要改进的)