反射听起来就好像很厉害的样子,我们可以想象一下,利用一个反射镜放在路旁,便可以看到我们背后所拥有的好多实物。对的,在Java编程中也有这样的一种机制---反射机制。
当我们拥有了这面”镜子“之后,可以同构摆放镜子的位置来调整我们想要看到的东西。其中这面镜子指的是我们反射机制中的Class类的对象;而如何摆放镜子的位置便是我们所需用到的方法。
下面我们看一下是如何得到这面镜子:
首先需要清楚我们想要看到什么东西 ,也即被看到的对象,eg:public class Student(){ ............... },有这么一个学生类,然后里面有好多的方法、属性包括共有的、私有的。
现在我想不通过传递参数的方法调用就可以拥有获取Student 中的那些东西,此时就可以利用之前提到的镜子了。怎么用?
eg:假如说有这么一个家伙Guy想要看到Student,那么请看
public class Guy (){
public static void main(String[] args) throws Exception {
Student stu=new Student();//创建想要看到的对象
Class stuMirror=stu.getClass();//这样就拿到了所需要的镜子,也即Class对象
//那到家那镜子之后,
/***********1、可以通过Class对象创建对象************/
Student stuInstance = (Student) stuMirror.newInstance();
/***********2、可以通过Class获取所有的构造函数 ************/
//获取有参数的构造方法Declared
Constructor[] constructors = stuClass.getDeclaredConstructors();
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i].getName() + " "
+ Modifier.toString(constructors[i].getModifiers()));
}
Constructor constructor = stuMirror.getDeclaredConstructor(String.class,int.class);
Student studen = (Student)constructor.newInstance("张三",34);
System.out.println(studen);
/*****************3、可以通过Class获取所有普通函数 *************************/
Method[] methods = stuClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
Method method = stuMirror.getDeclaredMethod("study", java.lang.String.class);
//调用方法
method.invoke(studen,"李四");
//获取私有方法
Method priMethod = stuClass.getDeclaredMethod("play");
//去除方法权限修饰符
priMethod.setAccessible(true);
priMethod.invoke(studen);
/************** *********4、通过Class对象获取所有属性******************************/
Field[] fields = stuClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
//以上四种便是我们拿到镜子之后可以做到的事
前提是Student里面函数一些共有的、私有的属性、共有的、私有的函数以及构造方法。
}
}