反射:
概述:在程序运行期间,通过该类的字节码文件对象,来获取及使用该类中的成员(构造方法,变量,方法)。
怎么获取该类的字节码文件对象?
A:Object类中的getClass()方法。
B:该类的class属性。
C:Class类中的forName()方法。
注意:这个方法传的参数,是该类的全类名(包名+类名)。
我们一般使用哪种方式获取字节码文件对象?
实际开发中,用第三种比较多。因为它可以和配置文件结合使用。
Class类中的方法:
public Object newInstance();
//根据给定的构造器对象来创建该类的对象(默认使用的是该类的空构造器)。
反射获取类中的构造方法(构造器):Constructor
getConstructor(); //根据给定的参数获取该类的构造器对象。
getConstructors(); //获取的是该类所有的公共的构造器对象
getDeclaredConstructors(); //获取该类的所有的构造器对象
/*
我们之前创建对象:直接new就行了。
使用反射创建该类的对象:
1、通过forName()方法获取该类的字节码文件对象。
2、通过Class类中的getConstructor()方法来获取指定的构造器对象。
3、根据获取到的构造器对象来创建该类的实例。 (newInstance()方法)
*/
反射获取类中的成员变量:Field
getField(); //获取指定的成员变量(公共的)
getFields(); //获取所有的公共字段(包括父类的)
getDeclaredField(); //获取指定的成员变量(私有的,公共的)
getDeclaredFields(); //获取本类所有的成员变量(包括私有)
set(Object obj,Object value): 修改指定对象(obj)的某个属性(谁调用就是谁)为指定的值(value)暴力访问(反射怎么越过泛型的检查):
setAccessible(true);
反射获取类中的成员方法:Method
getMethod(); //获取指定的成员方法(公共的)
getMethods(); //获取所有的公共成员方法(包括父类的)
getDeclaredMethod(); //获取指定的成员方法(私有的,公共的
getDeclaredMethods(); //获取本类所有的成员方法(包括私有)
invoke(对象,运行这个方法所需要的实参); //运行指定对象的指定方法
面试题:
ArrayList<Integer>,往里边添加几个字符串?
思路:
获取ArrayList类中的add()方法,然后将该方法的形参类型改为Object类。
思考:如何写一个通用的 设置某个对象的某个属性为指定的值
setProperty(Object obj,String name, Object value)
动态代理:
概述:就是通过反射来获取一个代理。
怎么获取?
通过Proxy类(newProxyInstance())和InvocationHandler接口(子类对象)。
代理:本来是自己要做的事儿,结果找别人帮忙做了,这个别人就是代理。 |