什么是反射?
1、在程序执行的期间,动态获取类的信息,称为反射
2、反射的作用:①反射可以创建对象,但是new的效率比反射高。②反射可以获取类的属性和方法
使用反射创建对象
1、使用无参构造器创建对象
public static void main(String[] args) throws Exception {
//通过反射获取类对象,类对象就是class字节码文件
Class<?> clazz = Class.forName("cn.zyyx.json.User");
//利用反射使用无参构造器创建对象
User user = (User) clazz.newInstance();
user.setAge(22);
user.setId(1);
user.setName("紫炎易霄");
System.out.println(user);
}
运行结果
2、使用有参数构造器创建对象
//通过反射获取类对象,类对象就是class字节码文件
Class<?> clazz = Class.forName("cn.zyyx.json.User");
//利用反射使用有参构造器创建对象
Constructor<?> constructor = clazz.getConstructor(Integer.class,String.class,Integer.class);
//使用构造器创建对象
User user = (User) constructor.newInstance(666,"黑袍萧寻",29);
System.out.println(user);
运行结果
使用反射获取类的信息
1、获取类中所有的属性名称和方法名称
//通过反射获取类对象,类对象就是class字节码文件
Class<?> clazz = Class.forName("cn.zyyx.json.User");
//获取类中所有的属性名称
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println("属性名称:"+field.getName());
}
System.out.println("-------------------------------------------------------------");
//获取类中所有的方法名称
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println("方法名称:"+method.getName());
}
运行结果
2、修改类中私有的属性值
Class<User> clazz = (Class<User>) Class.forName("cn.zyyx.json.User");
User user = clazz.newInstance();
//我已经把User类中的getter和setter方法删除了
//获得id对应Field
Field id = clazz.getDeclaredField("id");
id.setAccessible(true);
id.set(user, 6);
//获得name
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(user, "紫炎易霄");
//获得age
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);
age.set(user, 29);
System.out.println(user);
运行结果