反射的作用:
a: 在运行时,我们可以获取任意一个类的方法和属性(包括私有).
b: 在运行时,我们可以调用任意一个对象的方法和属性.
反射的前提:
A: 要获取类的对象,也就是字节码对象(Class对象).
a:获取方式:
(1) 通过Object的getClass()方法获取, 但是必须要有对象.
(2) 通过类名.class的方式获取,任意一个类名都可以这样获取该类的字节码对象.
(3) 通过Class类的静态方法forName(包名.类名)的方式获取.(只需要有字符串就可以,使用更为灵活.推荐使用). //包含全路径的类名
反射的构造方法:
A: 为了创建对象和给成员变量进行初始化.
a: getConstructors()方法 返回所有的构造,以数组的形式返回,必须以public修饰.
b: getConstructor(可变参数)根据指定参数获取Constructor对象.
c: 通过newInstance()方法创建对象 ,不能传参数
d: 反射获取的构造方法,成员变量和成员方法都是以对象的形式返回.
反射public成员变量(字段) (学生类举例):
A: 通过反射运行public变量流程
a:通过反射获取该类的字节码对象. //Class clazz = Class.forName("com.it001.Student").
b:创建该类对象 . //Object stu = clazz.newInstance();
c:获取该类中需要操作的成员变量(字段).//Field f = clazz.getField("sge") 只能获取公共的成员变量
d:通过字段对象中的方法修改属性值. //f.set(stu,99); 参数一是指要修改那个对象中的成员变量,参数二是指具体修改为什么值
B: 反射private属性执行流程
a:获取该类的字节码对象. //同上
b:获取该类对象. //同上
c:通过getDeclaredField方法获取私有成员变量//Field f = clazz.getDeclaredField("name");
d:通过setAccessible让JVM不检查权限. //f.setAccessible(true);
e:通过set方法设置对象为具体的值 //f.set(stu, "张三丰");
反射获取成员方法:
A:反射public方法执行流程:
a:获取学生类字节码对象. //Class clazz = Class.forName("com.it001.Student").
b:反射手段创建学生对象. //Object stu = clazz.newInstance();
c:调用getMethod方法获取Method对象,方法形参接收方法的名字.
d:调用Method方法中的invoke()讲方法运行.
B:反射private属性执行流程:
a: 获取字节码对象 . //
b: 创建学生对象 .
c: 暴力反射获取方法 //Method method = clazz.getDeclaredMethod("method");
d: 不让JVM检查权限 //method.setAccessible(true);
e: 执行方法 //method.invoke(stu);
JavaBean:
A: 将需要操作的多个属性封装成JavaBean,就是用于封装数据的.
B: 规范:
a: 类使用公共修饰.
b: 私有成员变量.
c: 为成员变量提供getter和setter方法.
d: 提供无参构造
BeanUtils:
A: 由Apache的组织编写,有一个系列可以提高开发效率(Commons) BeanUtils就是该系列之一.
B: BeanUtils的常用方法:
a:setproperty 用来给对象中的属性赋值.
(1) 参数1: 需要设置属性的对象.
(2) 参数2: 需要修改的属性名称.
(3) 参数3: 需要修改的具体元素. .
b:getProperty 用来获取对象中的属性:
(1) 参数1: 要获取的javaBean对象.
(2) 参数2: 对象中的哪个属性.
c: Populate 用来给对象中的属性赋值
(1)参数1: 要设置属性的对象.
(2)参数2: 将属性以Map集合的形式传入. Key : 属性的名称 Value: 属性具体的值.
C: 三个方法底层是通过反射实现, 而且反射操作的是setXxx方法和getXxx方法.
定义MyBeanUtils工具类, 实现与BeanUtils相同的功能:
a: 设置任意对象的, 任意属性, 为任意的值.
b: 获取任意对象的任意属性.
c: 修改任意对象中的属性, 为传入Map集合中的键和值 .
自定义BeanUtils的populate方法实现:
A: 修改任意对象中的属性, 为传入Map集合中的键和值
a: 获取传入对象的字节码对象
b: 获取map集合中所有的键和值
c: 调用Class中的getDeclaredField()方法将每一个键传入, 得到Field对象
d: 通过Field对象中的set方法赋值
e: Try catch捕获getDeclaredField方法可能发生的异常.(为了方式传入错误的值)
|
|