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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© shi0000 中级黑马   /  2014-4-14 23:48  /  849 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

                                                                        反射
一、什么是反射:
反射机制指的 是程序在运行时能够获得自身的信息,即在java中,当给定一个类的名字时,就可以通过反射机制得到该类的所有信息。
  优点:实现动态创建对象和编译,体现出很大的了灵活性。
  缺点:对性能有影响,这类操作总是鳗鱼只直接执行相同的操作。
二、Class
        获得Class对象的三种方式:
1、调用某一个类的class属性,(得到的就是一个类的一份字节码文件)
2、使用Class类的forNameString className)静态方法
3、调用某个对象的getClass()方法。
  九个预定义的Class对象:
byte,short,int,long,char,float,double,boolean        以及关键字void
三、如何利用Class类得到ConstructorMethodField
构造函数:
getConstructorClass<?> parameterTypes):得到指定的public构造方法。
getDeclaredConstructor(Class<?> parameterTypes):得到指定的构造方法,与访问权限无关。
getDeclaredConstrucor():得到所有的构造方法,与访问权限无关。
方法:
getMethodString nameClass<?> parameterTypes:得到该对象表示类和其父类的指定的public
方法。
getMethods():得到对象表示类和其父类中的所有public方法。
getDeclaredMethodString nameClass<?> parameterTypes):得到该对象表示类的指定方法,与访问权限无关。但不包含继承的方法。
getDeclaredMethods():得到类所有方法,与访问权限无关,但不包含继承的方法。
Field
同理。
四、反射创建对象:
1、使用User.class.newInstance()(直接newInstance必须保证默认的构造方法正常存在,也就是没有被私有化)
2、获取该类的Class对象,利用Class对象的getConstructor()方法获取指定的构造方法,再调用ConstructornewInstance()方法创建对象。
注意:setAccessibleboolean flag)当flagtrue时,忽略访问权限。
备注:对于此时的话,单例模式就不在安全了。
对于枚举而言,反射议案没有办法重新创建对象。
五、反射和泛型
通过指定对应的Class对象,程序可以获得该类中所有的Field,不管该Field使用何种权限,获得Field对象后都可以使用getTypes()来获取其类型。
利用反射来获取泛型的类型:
步骤:
1、获取当前类
2、获取目标字段
3、获取包含泛型类型的类型getGenericType()
4、强转至子类ParameterizedType,因为Type没有任何对应的方法。
5、获得泛型真正的类型getActualTypeArguments()

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马