1.什么是反射?
Java的反射就是指在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法。这种动态获取信息以及动态调用对象方法的功能被称为Java的反射机制。
2.使用反射
2.1 获取class对象
//第一种,类的class
Class c = Student.class;
//第二种,实例对象的getClass方法
Class c = new Student().getClass();
//第三种,根据类路径获取
Class c = Class.forName("zhangff01.vo.Student");
2.2获取类的属性和方法并调用
//测试类,为求简介舍去get/set方法
public class BaseClassA{
public String basePub = "base public field";
private String basePri = "base private field";
...
}
public class ClassA extends BaseClassA{
public String pubField = "public field";
private String prifield = "private field";
ClassA() { }
ClassA(String a, String b) {
this.prifield = a;
this.pubField = b;
}
...
}
public static void main(String[] args) throws Exception {
ClassA classA = new ClassA();
Class<?> aClass = classA.getClass();
//获取类所有属性,不包括基类
Field[] declaredfields = aClass.getDeclaredFields();
//获取类的所有public属性 包括基类
Field[] fields = aClass.getFields();
for (Field field : declaredfields) {
//设置private对象为可访问
field.setAccessible(true);
//获取具体对象该属性的具体值
String value = (String) field.get(classA);
System.out.println(field.getName() + "的值为:" + value);
}
for (Field field : fields) {
//获取具体对象该属性的具体值
String value = (String) field.get(classA);
System.out.println(field.getName() + "的值为:" + value);
}
//根据属性名获取具体的某一项属性(不包括基类)
Field Declaredfield = aClass.getDeclaredField("prifield");
//根据属性名获取具体的某一项public属性(基类)
Field field = aClass.getField("basePub");
//获取类的方法类似
//获取类所有方法,不包括基类
Method[] declaredMethods = aClass.getDeclaredMethods();
//获取类的所有public方法 包括基类
Method[] methods = aClass.getMethods();
for (Method method : declaredMethods) {
//设置private方法为可访问
method.setAccessible(true);
//调用方法,入参为方法调用的具体对象和方法的参数
method.invoke(classA, "");
}
//根据方法名和参数类型获取具体方法
aClass.getDeclaredMethod("setPrifield", String.class);
aClass.getMethod("setPubField", String.class);
}
2.3 对象实例化
public static void main(String[] args) throws Exception {
Class<?> aClass = ClassA.class;
//对于有空的构造函数的类可以直接用class.newInstance()获取实例
Object objA = aClass.newInstance();
//如果没有空的构造函数的类则需要先获取到类的构造方法,在通过该构造方法类获取实例
//获取构造函数(参数为相应构造方法的参数)
Constructor<?> constructor = aClass.getConstructor(String.class, String.class);
//调用构造方法(需要带上相应构造方法的参数)
constructor.newInstance("a", "b");
//以下几个方法和获取属性的方法基本差不多,可以类推出它的功能
//aClass.getConstructor();
//aClass.getConstructors();
//aClass.getDeclaredConstructor();
//aClass.getDeclaredConstructors();
//constructor.setAccessible(true);
}