java反射机制
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);
⑹.反射类关系图:

浙公网安备 33010602011771号