反射详解
- 反射
- 什么是反射?
- 常见操作
- 反射中常用类
- 1.Class类
- 获取Class对象的三张方式
- 类名
- 通过forName()方法
- 通过对象
- 2.Constructor类
- 获取Constructor构造方法的方式
- 执行Constructor构造方法的方式
- 3.Field类
- 获取Field成员变量的方式
- 获取所有成员变量
- 获取指定成员变量
- 使用Field成员变量的方式
- 4.Method类
- 获取Method方法的方式
- 执行Method方法的方式
- 其他
反射
什么是反射?
反射是Java语法的一种高级特性,在“运行期间”对Java的类型信息进行检查、操作处理。
例如:加载JDBC驱动类、MyBatis动态处理resultType、Spring根据配置信息创建Bean对象等使用场景。
常见操作
- 获取Class类型信息
- 执行构造方法创建对象
- 调用实例方法
- 通过成员变量保存值和获取值
反射中常用类
1.Class类
Class对象用于保存一个类的类型信息,它是反射的入口操作。
获取Class对象的三张方式
类名
Class bookClass = Book.class;
通过forName()方法
Class cls2 = Class.forName("com.apesource.Demo.Book");
通过对象
Class cls3 = new Book().getClass();
2.Constructor类
代表一个类中的构造方法(构造器),用于创建“目标”对象
获取Constructor构造方法的方式
- 获取无参构造方法 Class对象.getConstructor()
- 获取有参构造方法 Class对象.getConstructor(Class…)
//获取无参构造方法
Constructor constr1 = cls2.getConstructor();
//获取有参构造方法
Constructor constr2 = cls2.getConstructor(String.class,String.class,double.class,int.class);
执行Constructor构造方法的方式
- 执行无参构造方法 Constructor对象.newInstance()
- 执行有参构造方法 Constructor对象.newInstance(值…)
//执行无参构造方法
Object obj2 = constr1.newInstance();
//执行有参构造方法
Object obj3 = constr2.newInstance("西游","吴承恩",120.5,500);
3.Field类
代表一个类中的成员变量(字段),用于为“目标对象”保存值和获取值
获取Field成员变量的方式
获取所有成员变量
- public修饰的成员变量 Class对象.getFields()
- public\private修饰的成员变量 Class对象.getDeclaredField()
Field[] fields = cl.getFields();field.setAccessible(true);
Field[] fields = cl.getDeclaredFields();
获取指定成员变量
-
public修饰的成员变量 Class对象.getFields(成员变量名称)
-
public\private修饰的成员变量 Class对象.getDeclaredField(成员变量名称)
Field field = cl.getField("fieldName");field.setAccessible(true); Field field = cl.getDeclaredField("fieldName");
使用Field成员变量的方式
- Field对象.setXXX(目标对象,值)
//通过成员变量赋值
field.setAccessible(true);
field.set(obj,"葫芦娃");
4.Method类
代表一个类中的方法,用于调用执行该方法
获取Method方法的方式
- Class对象.getMethod()
- Class对象.getMethods()
//获取该类的指定方法
Method method = cl.getMethod(methodName, String.class);//获取该类的方法
Method[] methods = cls.getMethods();for(Method method : methods) {System.out.println(method); System.out.println("修饰符:"+method.getModifiers());System.out.println("返回值类型:"+method.getReturnType());System.out.println("参数列表:"); for(Parameter c : method.getParameters()){ System.out.print(c);}System.out.println();System.out.println("方法名:"+method.getName()); System.out.println();
}
执行Method方法的方式
- Method对象.invoke(目标对象,方法参数)
//执行
Object invoke = method.invoke(obj, UUID.randomUUID().toString());
其他
//获取该类的接口信息
Class[] interfaces = cls.getInterfaces();//获取该类的包信息
Package package1 = cls.getPackage();//获取该类的父类信息
Class superclass = cls.getSuperclass();