在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信息来发现该对象和类的真实信息
通过反射可以使程序代码访问装载到JVM 中的类的内部信息 获取已装载类的属性信息 获取已装载类的方法 获取已装载类的构造方法信息
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中 Class类:代表一个类 Field 类:代表类的成员变量(属性) Method类:代表类的成员方方法 Constructor 类:代表类的构造方法 Array类:提供了动态创建数组,以及访问数组的元素的静态方法
1
1.通过反射,可以知道类中的所有信息 2.通过反射,可以操作对象的方法,构造函数,属性 3.反射使用在框架技术中 4.自定义的注解和泛型,也要使用反射技术 5.注解在该类中,就可以通过类名得到消息。
Class clazz1=Class.forName(“com.pctc.model1.Teacher”); Object obj = clazz1.newInstance(); =============》 Teacher obj=new Teacher();
// 调用getDeclaredField(“name”) 取得name属性对应的Field对象 Field f = clazz1.getDeclaredField(“name”); // 取消属性的访问权限控制,即使private属性也可以进行访问。 f.setAccessible(true); // 调用get()方法取得对应属性值。 System.out.println(f.get(obj));
===============》 obj.getName();
// 调用set()方法给对应属性赋值。 f.set(obj, “Ilikeyou”); //相当于obj.setName(“lkl”); // 调用get()方法取得对应属性修改后的值。 System.out.println(f.get(obj));
================》 obj.set(“ilikeyou”); obj.get();
分析: 每一次带上obj,obj代表是一个实例对象的含义。 例如f.set(obj, “Ilikeyou”); obj是对象,f是对应的成员变量。
Class clazz1=Class.forName(“com.pctc.model1.Teacher”); obj = clazz.newInstance(); ============》 Teacher obj=new Teacher(); // 调用该对象的div方法 Method amethod= clazz.getMethod(“div”,new Class[]{int.class, int.class}); Object result = amethod.invoke(obj, new Object[] { 5, 7 }); System.out.println(result); ===========》 obj.div(5,7); 分析: amethod确定了方法名(div)和参数类型(int,int) invoke方法通过obj对象和形参的值,对应amethod确定方法来操作。
** // 创建一个含有20个元素的整型数组 Class clazz = Class.forName(“java.lang.Integer”);
Object arr = Array.newInstance(clazz, 20); // Object arr=Array.newInstance(Integer.TYPE, 20); // 给第三个元素赋值 Array.set(arr, 3, 200); // 取出第三个元素值并输出 Object elem = Array.get(arr, 3); System.out.println(elem); Class clazz=int.class; Object arr = Array.newInstance(clazz, 20); Array.setInt(arr,3,200); int elem=Array.getInt(arr,3); System.out.println(elem);****// 创建一个含有10*25个元素的整型数组 int dims[] = { 10, 25 };
Object arr = Array.newInstance(int.class, dims); // 给arr[6][18]赋值 Object arr6 = Array.get(arr, 6); Array.set(arr6, 18, 3000); // 取出arr[6][18]值并输出 Object elem = Array.get(arr6, 18); System.out.println(elem);**反射数组相对比较好理解。 相当是方法传形参值。要什么就给什么。 例如Array.newInstance( )要一个数组类型和数组大小。20是一维,{20,20}是二维,{20,20,20}是三维。 后面一样的。 了解就可以了。