1.java反射机制的作用:
使java具备了动态性,可以在运行时构造任意一个类的对象,可以在运行时获取任意类的任意成员,并修改其成员变量或者调用其方法。写程序时(比如
框架)无法知道将来要被调用的类名,所以,无法new对象。所以,反射机制解决了框架要解决的核心问题。反射就是把java类中的各个成分映射成相应的
java类。比如:成员变量映射到Field类。
2.反射机制的主要成员类。
Class类:位于java.lang包中,Class类的实例对象是某个类的字节码。
以下类均位于java.lang.reflect包中:
Field 类:代表类的成员变量。该类提供一系列方法操作成员变量 Method类:代表类的方法。提供invoke方法,用以调用方法。
Constructor 类:Constructor 提供关于类的单个构造方法的信息以及对它的访问权限
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。
3.简单示例。
⑴.获取Class字节码的三种方式:
// 1.Class类中提供的forName()方法,接受完整类名,获取字节码。 Class cls1 = Class.forName("java.lang.String"); // 2.使用类名.class Class cls2 = String.class; // 3.使用对象.getClass();该方法位于Object类中,返回运行时类。 Class cls3 = new String("abc").getClass();
⑵.获取类中成员,属性和方法:
// 获取所有成员变量,包括私有、和受保护的。用数组接收并遍历打印。 Field[] fields = cls1.getDeclaredFields(); for (Field field : fields) { System.out.println(field); } System.out.println("-----------------------以下为方法-------------------------------"); // 获取所有成员方法,包括私有、和受保护的。用数组接收并遍历打印。 Method[] methods = cls2.getDeclaredMethods(); for (Method method : methods) { System.out.println(method); }
⑶.反射获取构造函数,并构建对象:
// 获取带一个String类型参数的构造函数,并使用该方法构建对象。 Constructor constructor = cls3.getDeclaredConstructor(String.class); String str1 = (String)constructor.newInstance("hys"); System.out.println(str1); // 如果只需要用到无参构造函数,可以使用以下方法: String str2 =(String)Class.forName("java.lang.String").newInstance();
⑷.获取所需方法,并调用,以String类中concat()方法为例:
// 获取String类中的concat()方法。 Method method1 = String.class.getDeclaredMethod("concat", String.class); // 调用concat()方法。 String newString = (String) method1.invoke(str1, "--->syh"); // 输出结果为:hys--->syh System.out.println(newString);
⑸.数组的反射及应用。
具有相同类型和相同维数的数组,字节码相同。如:
int[] arr1 = new int[3]; int[] arr2 = new int[4]; // 输出:true System.out.println(arr1.getClass()==arr2.getClass());
使用数组:
Class str = Class.forName("java.lang.String"); // 创建String类的数组,长度为10. Object arr = Array.newInstance(str, 10); // 设置第七个对象的值。 Array.set(arr, 7, "Hello,itcast!"); String str7 = (String)Array.get(arr, 7); // 输出结果为:Hello,itcast! System.out.println(str7);
⑹.反射类关系图: