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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 横溢天使 中级黑马   /  2015-10-7 09:30  /  489 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

各位大神,谁知道哪里有反射的视频或是整理的知识啊?在下急求

1 个回复

倒序浏览

反射:
        概述:在程序运行期间,通过该类的字节码文件对象,来获取及使用该类中的成员(构造方法,变量,方法)。
        怎么获取该类的字节码文件对象?
                A:Object类中的getClass()方法。
                B:该类的class属性。
                C:Class类中的forName()方法。  
                        注意:这个方法传的参数,是该类的全类名(包名+类名)。
        我们一般使用哪种方式获取字节码文件对象?
                实际开发中,用第三种比较多。因为它可以和配置文件结合使用。


                Class类中的方法:
                        public Object newInstance();   
                                //根据给定的构造器对象来创建该类的对象(默认使用的是该类的空构造器)。



                反射获取类中的构造方法(构造器):Constructor
                        getConstructor();                        //根据给定的参数获取该类的构造器对象。
                        getConstructors();                        //获取的是该类所有的公共的构造器对象       
                        getDeclaredConstructors();        //获取该类的所有的构造器对象

                        /*
                                我们之前创建对象:直接new就行了。

                                使用反射创建该类的对象:
                                        1、通过forName()方法获取该类的字节码文件对象。
                                        2、通过Class类中的getConstructor()方法来获取指定的构造器对象。
                                        3、根据获取到的构造器对象来创建该类的实例。  (newInstance()方法)
                        */

                反射获取类中的成员变量:Field
                        getField();                                //获取指定的成员变量(公共的)
                        getFields();                        //获取所有的公共字段(包括父类的)
                        getDeclaredField();                //获取指定的成员变量(私有的,公共的)
                        getDeclaredFields();        //获取本类所有的成员变量(包括私有)

                        set(Object obj,Object value):   修改指定对象(obj)的某个属性(谁调用就是谁)为指定的值(value)暴力访问(反射怎么越过泛型的检查):
                                setAccessible(true);

                反射获取类中的成员方法:Method
                        getMethod();                        //获取指定的成员方法(公共的)       
                        getMethods();                        //获取所有的公共成员方法(包括父类的)
                        getDeclaredMethod();        //获取指定的成员方法(私有的,公共的
                        getDeclaredMethods();        //获取本类所有的成员方法(包括私有)

                        invoke(对象,运行这个方法所需要的实参);     //运行指定对象的指定方法

面试题:
        ArrayList<Integer>,往里边添加几个字符串?
                思路:
                        获取ArrayList类中的add()方法,然后将该方法的形参类型改为Object类。

思考:如何写一个通用的 设置某个对象的某个属性为指定的值
                setProperty(Object obj,String name, Object value)

动态代理:
        概述:就是通过反射来获取一个代理。
        怎么获取?
                通过Proxy类(newProxyInstance())和InvocationHandler接口(子类对象)。
        代理:本来是自己要做的事儿,结果找别人帮忙做了,这个别人就是代理。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马