一、反射机制
指的是可以于运行时加载、探知、使用编译期间完全未知的类。 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
Class c = Class. forName ("com.mqc.test.User");
加载完类之后,在堆内存中,就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射.
二、实例
package com.mqc.reflection;
import com.mqc.bean.User;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author maoqichuan
* @ClassName: Demo01
* @description: 通过反射操作类(属性,构造器,方法等)
* @date 2019-06-1015:46
**/
public class Demo01 {
public static void main(String[] args) {
String path = "com.mqc.bean.User";
try {
Class<?> clz = Class.forName(path);
// 通过反射操作构造器构造对象
/**
* clz.getConstructor()与getDeclaredConstructors的区别
* getConstructor只能获取得到修饰符为public的构造器
* getDeclaredConstructors能够获取得到所有的构造器
* 属性、方法的API也是类似的道理
*/
Constructor<?>[] constructors = clz.getDeclaredConstructors();
//根据具体参数获取构造器
Constructor<?> constructor = clz.getDeclaredConstructor(String.class, int.class, String.class);
System.out.println("根据具体参数获取构造器"+constructor);
for(Constructor temp : constructors){
System.out.println("类的构造器:"+temp);
}
User user = (User) constructor.newInstance("毛其传",24,"001");
System.out.println("########################");
// 通过反射操作属性
Field[] fields = clz.getDeclaredFields();
Field field = clz.getDeclaredField("userName");
System.out.println("根据属性名字获取具体属性:"+field);
for(Field temp : fields){
System.out.println("类的属性:"+temp);
}
// 需要设置跳过安全检查,否则操作private属性时会报错,这也是反射的性能瓶颈所在
field.setAccessible(true);
//获取得到field属性后操作属性信息
System.out.println("通过Field获取得到属性值信息:"+field.get(user).toString());
field.set(user,"毛其传123");
System.out.println("修改之后的值:"+field.get(user).toString());
System.out.println("########################");
// 通过反射操作方法
Method[] methods = clz.getDeclaredMethods();
Method method = clz.getDeclaredMethod("setUserName", String.class);
System.out.println("根据名字跟参数获取具体方法:"+method);
for(Method temp : methods){
System.out.println("类的方法:"+temp);
}
// 执行方法
method.invoke(user,"毛其传3");
System.out.println("修改之后的值:"+field.get(user).toString());
}catch (Exception e){
e.printStackTrace();
}
}
}