前言
java反射之前只是听说而一直没有使用过,最近是在工作中,leader要我将检索条件封装成类,并要求之后如果需要拓展检索条件的话,只需要更改封装的类,提高可用性,这时候我就想到了反射。
原理
简单来说,java反射就是通过一定的方法获取该类的字节码对象(class对象),也就是.class文件,JVM在加载类是首先会在堆中创建类的.class对象,作为访问类静态变量/方法的接口。
获取字节码对象的方法
1、调用Class.forName(类的路径)方法
2、调用对象.getClass()方法
类的成员变量
// An highlighted block
// 获取类名
String strName01 = clazz.getName();// 获取完整类名
String strName02 = clazz.getSimpleName();// 直接获取类名 Query
// 获取属性
Field[] field01 = clazz.getFields(); // 返回属性为public的字段
Field[] fields = clazz.getDeclaredFields(); // 返回所有的属性
Field field03 = clazz.getDeclaredField("id"); // 获取属性为id的字段
// 获取普通方法
Method[] Method01 = clazz.getDeclaredMethods(); // 返回类中声明的方法
Method[] Method02 = clazz.getMethods(); // 返回类中的所有public方法
执行类方法
// get 方法
Method method1 = clazz.getDeclaredMethod("getId", null); // 返回getId这个方法,如果没有参数,就默认为null
Integer item = (Integer)method1.invoke(对象)
//set 方法
Method method2 = clazz.getDeclaredMethod("setId", int.class); // 返回getId这个方法,如果没有参数,就默认为null
method2.invoke(对象,102)