一.先来介绍下java的反射机制,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二.下面来用代码一步一步的讲解反射的运用。
1.Constructor类代表某个类中的一个构造方法。
Constructor con = String.class.getConstructor(StringBuffer.class);
String str = (String)con.newInstance(new StringBuffer("abc"));
System.out.println(str);
上面代码通过Constructor类,来得到一个String类的构造函数,具体是哪个构造函数,因为一个类中可以有多个构造函数,我们可以通过getConstructor方法括号中传递一个与我们想得到的构造函数的参数类型同样的参数即可。然后通过上一步得到的构造函数对象调用newInstance方法得到一个String对象。
2.Method类代表某个类的一个方法。
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str, 1));//jdk1.5语法
System.out.println(methodCharAt.invoke(str, new Object[]{1}));//jdk 1.4语法
其实Method类与Constructor类用法大体一样,通过getMethod(a,b)参数a为想得到的方法名,因为一个类中方法可以重载很多个,需要用b参数来指定想得到的方法的参数类型,这样就把方法确定了。然后通过上一步得到的Method对象调用invoke方法。需要注意的是代码当中的两句注释,jdk1.5的语法当确定参数的类型直接传递一个符合类型的参数即可,但1.4需要传递一个参数数组,代码中参数数组为什么要new Object[],是因为在java中Object是所有类的基类,new Object[]{,字符串,整数,....},我们就可以传递各种类型参数过去。
3.Field类代表某个类中的一个成员变量。
Field y = ref.getClass().getField("y");
Field x = ref.getClass().getDeclaredField("x");//对于私有变量要使用这个方法
x.setAccessible(true);//暴力反射
System.out.println(y.get(ref));
System.out.println(x.get(ref));
用法与上面两个类类似,这里就不细说了。注意的是对于私有变量的获取方法,尤其是setAccessible方法私有变量都可以暴力反射出来。今天晚了,就写到这,明天接着来。