1.、什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
2、类类
所有狗 狗类 Dog 狗对象 旺财
所有猫 猫类 Cat 猫对象 肥波
所有类 类类 java.lang.Class 类对象 特定类
3、反射获取类对象
1 class.forname("类全路径名");
2 类名.class
3 类实例.getclass() 代码如下:
package com.lingerqi.student; /** * 获取类对象 * 1、class.forname("类全路径名"); * 2、类名.class * 3、类实例.getclass() * @author xyls * */ public class test { public static void main(String[] args) throws ClassNotFoundException { Class fname = Class.forName("com.lingerqi.student.student"); Class clz=student.class; // student stu=new student(); // Class clz=stu.getClass(); System.out.println(clz); } }
4、 反射三大作用
1 实例化对象
c.newInstance(): 代码如下:
package com.lingerqi.student; import java.lang.reflect.Constructor; /** * 反射实例化 * 1、能够实例化未知的类 * @author xyls * */ public class test2 { public static void main(String[] args) throws Exception { Class clz = student.class; // student stu=(student)clz.newInstance(); // 调用一个参数的构造方法创建一个对象 // Constructor con=clz.getConstructor(String.class); // student stu=(student)con.newInstance("s001"); // 两个参数的构造方法创建对象 // Constructor con=clz.getConstructor(String.class,String.class); // student stu=(student)con.newInstance("s001","zs"); Constructor con = clz.getDeclaredConstructor(Integer.class); con.setAccessible(true); student stu = (student) con.newInstance(12); } }
2 动态调用方法
Method m;
m.invoke
package com.lingerqi.student; import java.lang.reflect.Method; /** * 反射调用方法 * @author xyls * */ public class test3 { public static void main(String[] args)throws Exception { student stu=new student(); // stu.hello(); Class clz=stu.getClass(); // Method m=clz.getDeclaredMethod("hello"); // m.invoke(stu); Method m=clz.getDeclaredMethod("add", Integer.class,Integer.class); m.setAccessible(true); m.invoke(stu, 20,4); } }
3 读写属性
Field set/get
package com.lingerqi.student; import java.lang.reflect.Field; /** * 反射的赋值取值 * @author xyls * */ public class test4 { public static void main(String[] args)throws Exception { student stu=new student(); Class clz=stu.getClass(); // Field field=clz.getDeclaredField("sid"); // field.setAccessible(true); // field.set(stu, "s002"); // System.out.println(field.get("stu")); Field[] fields=clz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); System.out.println(field.getName()); } } }