我这样理解反射
- 反射是什么?
反射是java的核心技术点之一,也是诸多java框架的基石之一。学习之前,先看其定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取、调用对象方法的功能称为java语言的反射机制。
通过定义,可以看出反射是在运行状态中作用,对象可以通过反射的方式动态获取和调用任意一个类的方法、属性等。
- 反射如何使用?
首先看一下我们正常要使用一个对象,是如何使用,一般地,我们定义一个类,给他赋值,可以在其他类中new出这个对象,然后调用对象中定义的属性和方法。代码如下:
package com.jbzhang.refdemo;
public class RefTest {
public static void main(String[] args) {
User user=new User();
//h获取属性
user.setUsername("jbzhang");
//获取方法
user.getUserBy();
}
}
那么反射怎么做呢?其实反射要做的事情就是从类或对象中推导出Class类,然后再从Class类中获得类的信息。
- 如何获取class类?
在上面的例子中class类是User类的类。获取它有三种方式,如下:
//如果已经获取到类,通过静态变量获取class
Class c1=User.class;
//如果知道对象,通过getclass()获取类
Class c2=user.getClass();
//通过forname()获取
Class c3=Class.forName("com.jbzhang.refdemo.User");
System.out.println(c1==c3); //c1 c2 c3 都是一样的
System.out.println(c1.getName()); //com.jbzhang.refdemo.User 获取类的名字,包含包名
System.out.println(c1.getSimpleName());//User 获取类的名字
我们得到了User的class类,那么就可以通过class获取很多需要的信息。比如类里面的方法、属性、构造函数等。下面的代码都有体现。
public class ClassUtil {
public static void printClass() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class c=Class.forName("com.jbzhang.refdemo.User");
//获取类的所有方法,有两种方式
/**
* getDeclaredMethods() 获取这个类自己声明的方法
* getMethods() 获取所有public 的方法,包括父类的
*/
Method[] m=c.getDeclaredMethods();
//Method[] m1=c.getMethods();
for (int i=0;i<m.length;i++){
//得到所有方法的返回值
Class cs=m[i].getReturnType();
System.out.println("方法的返回值是"+cs.getName());
//得到方法的名称
System.out.println("方法名是:"+m[i].getName());
//获得的参数类型
Class[] par=m[i].getParameterTypes();
for(int j=0;j<par.length;j++){
System.out.println("方法的参数类型"+par[i].getName()+",");
}
}
/**
* 获取成员变量的数组
* getFields() 获取所有public 的成员变量的信息
* getDeclaredFields() 获取该类自己声明的变量
*/
Field[] fs=c.getFields();
Field[] fs1=c.getDeclaredFields();
//获取构造方法的数组
Constructor[] cst=c.getConstructors();
for(int k=0;k<cst.length;k++){
//获取构造方法的参数类型
Class[] cpars=cst[k].getParameterTypes();
}
//获取特定的方法
Method method=c.getMethod("getUserBy");
//方法调用
method.invoke(c);
}
}