反射是基础中最重要的一部分内容了,我们的类在运行的时候会进行三个步骤。
1.类的加载:把类的.class文件加载到java.lang.class文件中去。
2.类的连接:给类分配地址,分配内存。
3.类的初始化:就是使用构造方法创建类对象。public 类名() {}
比如一个学生类,以前我们创建使用:Student s = new Student();
s.name = "张三";
s.method;
但学了反射后我们可以这样创建:
1.获取类的管理对象类Class,Class类对象是所有类的运行环境。Class.forName("类路径");
Class<?> c = Class.forName("System.Student");
2.通过这个Class类管理对象我们可以通过它的方法获取类的构造方法,成员变量和成员方法。
A,获取类的构造方法:
Constructor<?>[] cons = c.getDeclaredConstructors();//获取全部构造方法
Constructor<?> con = c.getDeclaredConstructor(String.class, int.class); //根据指定的参数获取指定的构造方法。
B,获取成员变量:
Field[] fields = c.getDeclaredFields(); //获取所以的成员变量
Field name = c.getField("name"); //根据姓名获取成名变量
C,获取成员方法:
Method[] methods = c.getDeclaredMethods(); //获取所有方法
Method method2 = c.getDeclaredMethod("method2", String.class); //根据方法名获取
好了,那么这些都会了之后,我们如何使用呢???
成员变量的使用如何:
Field name = c.getField("address"); Field name = c.getDeclaredField("address");
如何解决?把上面那句换成下面哪句就行,可是,为什么还是报错???
因为,我们的成员变量是private修饰符修饰的,所以说JVM运行会报错,但是我们的成员变量对象有个方法可以解决这个问题;
Field name = c.getDeclaredField("address"); name.setAccessible(true); //这句话就能暴力反射,强制设置成员变量 name.set(o,"北京");
成员方法的使用如下:
现在我们来加强练习,使用配置文件来运行Student类
1.创建class.txt文件用 键值对把 类的路径和方法名写入class.txt文件中去
2.创建Properties的对象,读取!class.txt文件;
3.使用反射赋值成员变量为张三,18岁,北京
4.使用method2方法