`
shi1870000
  • 浏览: 4960 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员——反射

    博客分类:
  • java
阅读更多

------- android培训java培训、期待与您交流! ----------

 

                                  黑马程序员——反射

<!--[if !supportLists]-->一、<!--[endif]-->什么是反射

反射机制指的 是程序在运行时能够获得自身的信息,即在java中,当给定一个类的名字时,就可以通过反射机制得到该类的所有信息。

  优点:实现动态创建对象和编译,体现出很大的了灵活性。

  缺点:对性能有影响,这类操作总是鳗鱼只直接执行相同的操作。

<!--[if !supportLists]-->二、<!--[endif]-->Class

 获得Class对象的三种方式:

<!--[if !supportLists]-->1、<!--[endif]-->调用某一个类的class属性,(得到的就是一个类的一份字节码文件)

<!--[if !supportLists]-->2、<!--[endif]-->使用Class类的forNameString className)静态方法

<!--[if !supportLists]-->3、<!--[endif]-->调用某个对象的getClass()方法。

  九个预定义的Class对象:

byte,short,int,long,char,float,double,boolean以及关键字void

<!--[if !supportLists]-->三、<!--[endif]-->如何利用Class类得到ConstructorMethodField

构造函数

getConstructorClass<?> parameterTypes):得到指定的public构造方法。

getDeclaredConstructor(Class<?> parameterTypes):得到指定的构造方法,与访问权限无关。

getDeclaredConstrucor():得到所有的构造方法,与访问权限无关。

方法

getMethodString nameClass<?> parameterTypes:得到该对象表示类和其父类的指定的public

方法。

getMethods():得到对象表示类和其父类中的所有public方法。

getDeclaredMethodString nameClass<?> parameterTypes):得到该对象表示类的指定方法,与访问权限无关。但不包含继承的方法。

getDeclaredMethods():得到类所有方法,与访问权限无关,但不包含继承的方法。

Field

同理。

<!--[if !supportLists]-->四、<!--[endif]-->反射创建对象:

<!--[if !supportLists]-->1、<!--[endif]-->使用User.class.newInstance()(直接newInstance必须保证默认的构造方法正常存在,也就是没有被私有化)

<!--[if !supportLists]-->2、<!--[endif]-->获取该类的Class对象,利用Class对象的getConstructor()方法获取指定的构造方法,再调用ConstructornewInstance()方法创建对象。

注意:setAccessibleboolean flag)当flagtrue时,忽略访问权限。

备注:对于此时的话,单例模式就不在安全了。

对于枚举而言,反射议案没有办法重新创建对象。

<!--[if !supportLists]-->五、<!--[endif]-->反射和泛型

通过指定对应的Class对象,程序可以获得该类中所有的Field,不管该Field使用何种权限,获得Field对象后都可以使用getTypes()来获取其类型。

利用反射来获取泛型的类型:

步骤:

<!--[if !supportLists]-->1、<!--[endif]-->获取当前类

<!--[if !supportLists]-->2、<!--[endif]-->获取目标字段

<!--[if !supportLists]-->3、<!--[endif]-->获取包含泛型类型的类型getGenericType()

<!--[if !supportLists]-->4、<!--[endif]-->强转至子类ParameterizedType,因为Type没有任何对应的方法。

<!--[if !supportLists]-->5、<!--[endif]-->获得泛型真正的类型getActualTypeArguments()

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics