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

© 刘闯2 中级黑马   /  2017-12-24 21:43  /  1541 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

41..反射:
        在运行时,我们可以获取任意一个类的所有方法和属性
        在运行时,让我们调用任意一个对象的所有方法和属性
(前提:)要获取类的对象(Class对象(字节码对象))
42..字节码文件获取的三种方式
1.对象名.getCalss();   // 次方法来自于Object  对象已经存在的情况下, 可以使用这种方式
2.类名.class                        // 类名.class这是一个静态的属性, 只要知道类名, 就可以获取
3.Class.forName(“com.itheima_01.Student”);                        // 通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名)
        // 此处将会抛出异常都系 ClassNotFoundException 防止传入错误的类名

字节码对象是用来描述什么的?                用来描述.class文件的,
面向对象阶段的时候讲过java中描述事物都是通过类的形式,而字节码文件也可以看做为一种事物, 如何描述这种事物?那就看看这个事物是由什么组成的了::1. 成员变量 2. 成员方法3. 构造方法

43.通过反射获取构造方法并使用
newInstance()方法, 只能通过空参的构造方法创建对象::获取该类中所有的构造方法, 返回的是一个数组
getConstructor(Class<T>… parameterTypes)方法, 方法接受一个可变参数, 可以根据传入的类型来匹配对应的构造方法::方法接受一个可变参数, 可以根据传入的类型, 来匹配对应的构造方法
注意:泛型只是作用于编译阶段,运行时会被擦除

44.通过反射获取成员变量并使用:
前提:        //获取学生类的字节码对象
                        Class clazz = Class.forName("com.itheima_01.Student");
                        //获取学生类的对象
                        Object stu = clazz.newInstance();
45..方法总结
             通过反射获取成员变量并使用  
                     Field[] getFields()              --> 返回该类所有(公共)的字段
                     Field getField(String name)      --> 返回指定名称字段

                    Field[] getDeclaredFields()      --> 暴力反射获取所有字段(包括私有) 
                    Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
              Field:
                      Object get(Object obj)          --> Field对象调用, 返回传入对象的具体字段
                      void set(Object obj, Object value) -->  Field对象调用
                                                        参数1: 要修改的对象
                                                        参数2: 将此对象的字段修改为什么值.
                        Field[] getDeclaredFields()      --> 暴力反射获取所有字段(包括私有) 
               Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
               void setAccessible(boolean flag) --> 让jvm不检查权限
Class:
    Method getMethod(String name, Class<?>... parameterTypes)  
            // 此方法由字节码对象调用
            // 参数1: 要反射的方法名称
            // 参数2: 此方法需要接受的参数类型(注意,传入的都是字节码)
Method:
    Object invoke(Object obj, Object... args)  
            // 方法由Method对象调用
            // 参数1: 要由那个对象调用方法
            // 参数2: 方法需要的具体实参(实际参数)

46.JavaBean的概述:将需要操作的多个属性封装成JavaBean, 简单来说就是用于封装数据
规范:
                        类使用公共进行修饰
                        提供私有修饰的成员变量
                        为成员变量提供公共getter和setter方法
                        提供公共无参的构造
                        实现序列号接口(可以被写到文件中,可以被持久化存储)
47.BeanUtils的由来:之前我们使用的类都是来自Java编写好的源代码,而这个BeanUtils却是一个叫做Apache的组织编写,那么这个组织编写的代码当中, 有一个系列可以很方便的提高我们今后的开发效率,这个系列为Commons, BeanUtils就是其中之一
只能给符合Javabean规范的类赋值

48.BeanUtils的常用方法
A.setProperty  用来给对象中的属性赋值(了解)
static void setProperty(Object bean, String name, Object value)
                参数1: 需要设置属性的对象
                参数2: 需要修改的属性名称
                参数3: 需要修改的具体元素       
B.getProperty 用来获取对象中的属性(了解)
static String getProperty(Object bean, String name)
                参数1: 要获取的javaBean对象
                参数2: 对象中的哪个属性
C.Populate 用来给对象中的属性赋值(掌握)
static void populate(Object bean, Map properties)
                参数1: 要设置属性的对象
                参数2: 将属性以Map集合的形式传入
                                        Key : 属性的名称
                                        Value:  属性具体的值
注意:BeanUtils的setProperty和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法;三个方法底层是通过反射实现, 而且反射操作的是setXxx方法和getXxx方法,所以编写JavaBean的时候一定要注意格式

可以通过类的字节码对象直接得到类的对象
Class<?> clazz = Class.forName("Homework02.Person");
//直接通过字节码对象得到类的对象
Object obj1 = clazz.newInstance();

5 个回复

倒序浏览
闯哥继续加油~~棒棒哒
回复 使用道具 举报
保持,继续努力
回复 使用道具 举报
还是棒棒哒
回复 使用道具 举报
温故而知新   加油哦   继续努力
回复 使用道具 举报

总结很不错哟~继续加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马