Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。
通过类的全路径名获取Class对象。返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于: Class.forName(className, true, currentLoader);其中 currentLoader 表示此类的定义类加载器。
拿到该类的Class对象后,可通过不同的方法拿到它的各种属性和方法。
System.out.println("===========================获取Class对象=====================");
//获取Class对象
Class<?> clazz = Class.forName("com.hu.test.Hu");
System.out.println(clazz);
System.out.println("===========================获取public属性=====================");
//获取该对象所包含的public属性的数组返回Field[]
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("===========================获取特定属性=========================");
//获取该对象中特定的public属性
Field habit = clazz.getField("habit");
System.out.println(habit.getType());
System.out.println("===========================获取属性值=========================");
//创建此 Class 对象所表示的类的一个新实例。
Object object = clazz.newInstance();
//获取该属性的值,需要传入一个Object实例 私有属性无法获取到值
System.out.println(habit.get(object));
System.out.println("===========================获取所有属性=========================");
//获取该对象中所表示的类或接口所声明的所有字段
//包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段
Field[] declaredFields = clazz.getDeclaredFields();
for (Field field2 : declaredFields) {
System.out.println(field2);
}
System.out.println("===========================获取特定属性=========================");
//获取该对象中的特定属性
Field sex = clazz.getDeclaredField("sex");
System.out.println(sex);
System.out.println("===========================获取所有方法=========================");
//返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法
//包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("===========================获取所有构造方法=====================");
//返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
System.out.println("===========================获取public构造方法===================");
Constructor<?>[] constructors2 = clazz.getConstructors();
for (Constructor<?> constructor : constructors2) {
System.out.println(constructor);
}
运行结果如下:

System.out.println("===========================获取构造方法对象==============");
//获取Class对象
Class<?> clazz = Class.forName("com.hu.test.Hu");
//通过该class对象获取构造方法
Constructor<?> constructor = clazz.getConstructor(String.class,char.class,int.class);
System.out.println(constructor);
System.out.println("===========================构建对象=====================");
//通过该构造方法创建对象
Object instance = constructor.newInstance("胡广",'男',21);
System.out.println(instance);
System.out.println("instance instanceof Hu:" + (instance instanceof Hu));
//获取该对象的class对象
Class<?> class1 = instance.getClass();
System.out.println("===========================访问属性=====================");
Field habit = class1.getDeclaredField("habit");
habit.set(instance, "音乐");
System.out.println("===========================调用对象方法=================");
//使用该对象获取指定方法
Method getName = class1.getDeclaredMethod("getName");
Method setName = class1.getDeclaredMethod("setName", String.class);
Method setAge = class1.getDeclaredMethod("setAge",int.class);
//执行方法
System.out.println(getName.invoke(instance));
setName.invoke(instance, "胡");
setAge.invoke(instance, 22);
System.out.println(instance);
运行结果如下:
