反射
1.定义:
- 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息。反射就是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法。
2.Class类:
-
对应的成员变量,构造方法,成员方法都是类。(反射就是先得到Class类对象,再通过该对象获得它的成员变量/构造方法/成员方法,最后分别通过成员变量/构造方法/成员方法的对象调用对应的方法)
-
获取Class类的对象的方法
-
法一:
Person p=new Person(); Class c=p.getClass();
-
法二:
Class c=Person.class;
-
法三:
Class c=Class.forName(类的地址);
-
方法选择:
-
法二相对简单,但一般开发选择法三,因为法三参数时字符串,比较灵活,可通过配置文件加载,便于维护。
-
3.通过反射获取构造方法
Class c=Class.forName(Person类地址);//以Person类为例子
//获取所有构造方法,返回的cons 是类对象的集合
//获取所有公共构造方法
Constructor[] cons=c.getConstructors();
//获取所有构造方法(包括私有)
Constructor[] cons=c.getDeclaredConstructors();
//遍历构造方法
for(Constructor con:cons)System.out.println(con)
//获取单个构造方法
//获取有参构造方法(无参就不填参数即可)
Constructor con=c.getConstructor(String.class,int.class,String.class);//获取有参构造方法(无参就不填参数即可)
//获取任意单个构造方法(包括私有)
Constructor con=c.getDeclaredConstructor(String.class);
//取消java语言访问检测
con.setAccessible(true);
//通过构造方法创建类对象
Object obj=con.newInstance(“林青霞”,12,“重庆”);
4.通过反射获取成员变量并赋值
//先利用反射创建对象
Class c=Class.forName(person类地址)
Constructor con =c.getConstructor();
Object obj=con.newInstance();
//获取所有成员变量
//获取所有共有的成员变量
Field[] fields=c.getFields();
//获取所有的成员变量(包括私有)
Field[] fields=c.getDeclaredFields();
//获取单个成员变量
//获取共有的单个成员变量(名称记得打引号)
Field field=c.getField(“变量名称”);
//获取任意一个成员变量(包括私有)
Field field=c.getDeclaredField("变量名称“);
//取消java语言访问检测
field.setAccessible(true);
//给成员变量赋值
field.set(obj,变量值)//多个变量用逗号隔开
5.通过反射获取成员方法
//先利用反射创建对象
Class c=Class.forName(person类地址)
Constructor con =c.getConstructor();
Object obj=con.newInstance();
//获取所有成员方法
//获取所有共有的成员方法
Method[] methods=c.getMethods();
//获取所有的成员方法(包括私有)
Method[] methods=c.getDeclaredMethods();
//获取单个成员方法
//获取共有的单个成员方法(名称记得打引号)
Method method=c.getMethod(“方法名称”);//必须public,默认的不行
//获取任意一个成员方法(包括私有)
Method method=c.getDeclaredMethod("方法名称“,参数的class类型);//多个参数用空格隔开,参数的class类型如:String.class
//取消java语言访问检测
method.setAccessible(true);
//调用成员方法
method.invoke(obj,参数)//多个参数用逗号隔开