A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔仁政 中级黑马   /  2017-12-24 22:22  /  1022 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射的作用:
        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方法可能发生的异常.(为了方式传入错误的值)
                               

3 个回复

倒序浏览
总结很棒哟,继续加油~~~
回复 使用道具 举报
保持,继续努力哦
回复 使用道具 举报
继续加油~~棒棒哒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马