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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星陨 中级黑马   /  2016-12-17 16:16  /  960 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

1.Class:所有的.class字节码文件的对象
         * 获取字节码文件对象的三种方式
         * 1.在Object类中 有一个方法  Class getClass方法  返回此 Object 的运行时类。
                 Person p = new Person();
                Class c1 = p.getClass();
         * 2.任意一个类包括基本类型 都有一个静态属性  class  可以通过这个静态属性 获取到Class对象
         *        Class c2 = Person.class;
         *
         * 3.通过Class 这个类静态方法 获取        static Class<?> forName(String className)
                Class c3 = Class.forName("demo2.Person");

2.Constuctor:所有构造方法的对象
       
         * 获取带参构造方法  并运行
         * 1.获取字节码文件对象
         * 2.通过字节码文件对象获取构造带参方法
         *                 Class类的方法
         *                         Constructor<T> getConstructor(Class<?>... parameterTypes)
         *                                Constructor con = c.getConstructor(String.class,int.class);有参构造
         *                         返回值类型     
         *                                 Constructor 描述构造方法的类
         *                         参数列表
         *                                 Class<?>... parameterTypes  可变参数   参数的数据类型 如果是String参数 写String.class
         *                
         * 3.通过构造调用 newInstance方法运行构造方法
         *                         Constructor方法
         *                          T newInstance(Object... initargs)
         *                                Object obj = con.newInstance("柳岩",38);有参
         *                          返回值
         *                                         T 代表泛型  没加泛型 就是Object       
         *                                         参数  空参构造不需要写参数 带参的需要给实际参数

        使用字节码文件对象创建对象的快捷方式

                前提:该类必须有空参构造方法,且该空参构造方法为public修饰的

                1.获取字节码文件对象
                2.调用字节码文件对象方法直接创建对象
                        Class类中
                                 T newInstance()   创建此 Class 对象所表示的类的一个新实例。

        获取私有的构造方法
                获取字节码文件对象
                Class c = Class.forName("cn.itcast2.Person");
                获取私有的构造方法
                Constructor con = c.getDeclaredConstructor(int.class,String.class);
                取消私有的权限
                con.setAccessible(true);
                调用方法
                Object obj = con.newInstance(38,"柳岩");

3.Filed:描述成员变量的类
       
         * 反射获取成员变量并赋值
         *
         * 1.获取字节码文件对象
         * 2.通过字节码文件对象 调用方法获取成员变量
         *                 Class类中的方法
         *                          Field[] getFields() 返回所有public修饰的成员变量
         *                          返回值类型
         *                                 Field是描述成员变量的类  
         *                          Field[] getDeclaredFields() 返回所有的成员变量
         *                          Field getField(String name) 返回指定成员变量名的成员变量 public
         *                          Field getDeclaredField(String name) 返回指定变量名的成员变量 包括私有也可以返回
         
         *                        
         
         * 3.通过成员变量对象调用方法为成员变量赋值
         *                         Field的方法
                                                Class c = Class.forName("cn.itcast2.Person");
                                                Field field = c.getField("sex");
         *                                 void set(Object obj, Object value) 为指定对象的属性赋值
                                                Object obj = c.newInstance();
                                                field.set(obj, "女");
         *                                 obj:指定的对象
         *                                 value:为这个对象当前属性赋的新值

3.Method:描述成员方法的对象
       
         * 获取带参成员方法并调用
         *
         * 1.获取字节码文件对象
         * 2.使用字节码文件对象 获取到要运行方法
         *                 Class的方法
         *                          Method getMethod(String name, Class<?>... parameterTypes)
         *                          获取指定名称的成员方法
         *                         name: 方法名
         *                         parameterTypes:方法的参数的类型  例如 String  String.class 因为是可变参 所以不写调用就是空参方法
         *                
         * 3.运行此方法
         *                 Method类的方法
                                        Class c = Class.forName("demo2.Person");
                                        Method m = c.getMethod("eat",int.class);
                                        Object obj = c.newInstance();
                                        m.invoke(obj,5);
         *                          Object invoke(Object obj, Object... args)
         *                          obj:对象
         *          args:实际参数
         *          返回值Object 是方法的返回值
         */

         * 获取私有的方法并运行
         * 1.获取字节码文件对象
         * 2.通过字节码文件对象获取方法
         * 3.将检查访问权限取消
         * 4.调用方法


4.泛型的擦除:
                ArrayList<Integer> list = new ArrayList<Integer>();
                list.add(11);
               
                Class c = list.getClass();
                Method md = c.getMethod("add", Object.class);
                md.invoke(list, "柳岩");
                md.invoke(list, "唐嫣");
               
                System.out.println(list);

反射机制:
        动态获取的信息以及动态调用对象的方法的功能
        运行状态中,对于任意一个类,都能知道这个类所有的属性和方法;
        对于任意一个对象,都能调用他的任意一个方法和属性

评分

参与人数 1黑马币 +5 收起 理由
peng84 + 5

查看全部评分

3 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马