Java反射(Reflection)
introspection(内省、内观、反省)
Class类:代表一个类;
Field类:代表类的成员变量;
Method类:代表类的方法;
Constructor类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组元素的静态方法;
反射的基本概念
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
重点
要想使用反射,首先要或者待处理类或对象所对应的Class对象;
在Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象;
要想使用反射,第一步首先要获取待操作类的Class对象
获取Class对象的三种方法:
- 类名.Class;
- 对象名.getClass();
- Class.forName(“要加载类的全路径”);
- 如:Class.forName(“Java.lang.String”);
使用反射执行某个类的某个方法,步骤如下:
- 先或者这个类的Class对象,如上三种方法任意一种都可以:
Class<?> classType = Class.forName("com.zkcx.reflection.Test");
- 通过Class对象的newInstance()方法获取到当前类的实例:
Object test = classType.newInstance();
- 获取想要调用方法的Method对象(通过class对象获取Method对象):
Method method = classType.getMethod("方法名", new Class[]{参数的class对象});
Method method = classType.getMethod("add", new Class[]{int.class, int.class});
- 通过获取到的Method对象执行方法:
Object object = method.invoke(要执行类的实例(test), new Object[]{需要给方法传递的参数列表});
Object object = method.invoke(test, new Object[]{25, 57});
此object就是add()方法最后输入的结果
- #### 若想通过类的不带参数的构造方法来生成对象,有两种形式 ####
- 先获得Class对象,然后通过该Class对象的newInstance方法直接生成即可:
Class<?> classType = String.class;
Object object = classType.newInstance();
- 先获得Class对象,然后通过class对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:
Class<?> classType = Test.class;
Constructor constructor = classType.getConstructor(new class[]{});
Object object = cons.newInstance(new Object[]{});
此object就是通过无参的构造方法生成的对象
- #### 若想通过类的带参数的构造方法来生成对象,只有一种形式 ####
- 先获得Class对象,然后通过Class对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:
Class<?> classType = Test.class;
Constructor constructor = classType.getConstructor(new class[]{String.class, int.class});
Object object = cons.newInstance(new Object[]{"zhangsan", 78});
- #### Integer.TYPE返回的是int,而Integer.class返回的是Integer类所对应的Class对象。 ####