论坛首页 入门技术论坛

Java中的反射——写给初学者

浏览 986 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-12-02  

      <!--[if gte mso 9]><xml><w:WordDocument><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery><w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery><w:DocumentKind>DocumentNotSpecified</w:DocumentKind><w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing><w:PunctuationKerning></w:PunctuationKerning><w:View>Normal</w:View><w:Compatibility><w:DontGrowAutofit/><w:BalanceSingleByteDoubleByteWidth/><w:DoNotExpandShiftReturn/><w:UseFELayout/></w:Compatibility><w:Zoom>0</w:Zoom></w:WordDocument></xml><![endif]-->

                 Java中的反射

 

本文是针对对于Java反射机制不甚了解的初学者所作。

 

在谈反射之前,首先了解下反射的作用,这样可以提高我们学习他的主动性。

大家都在说反射多么多么重要,多么好用,那么究竟体现在哪里呢,我就从最基本的方面谈谈。

 

一、反射的作用

 

设想在工作中,两个程序员分开工作,其中一个程序员需要使用另一个程序员所写的类,但是并不知道那个类是否已经开发好,也不知道那个类里的属性和方法,但是项目的需求,必须调用那个类。这时,就可以使用java的反射机制。

通俗的说,java的反射机制可以在运行状态中对于任何一个类,都能够知道这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种对于java类结构探知的能力,我们叫做java的“自审”,也即java的反射机制。

(注意:“运行状态中”是前提,如无此前提,反射就毫无意义了。)

 

知道反射的作用后,我们来探究下java反射的实质。

二、反射的实质

    

反射的所有功能都是基于一个Class类,让我们先了解下Class类。

 

万物皆对象,我们把具有共性的对象抽象成类。

每个类又有属性和方法,不管是已知的类,还是未知的类,那么对于类而言,它也有共性,所以java中把这个共性抽象化,新构建出一个Class(大家可以在JDK  java.lang包下找到这个类),因此,Class类并不是一个简单的类,而是一个类的模型,更贴切的说是类的抽象

我想这应该是反射初学者最不易理解的地方,打个比方解释一下:男人和女人都是人,人是男人和女人的抽象,是一个类;金丝猴和猕猴都是猴,猴也是一个类。但人和猴都是动物,Class类就相当于动物类。如果知道某个X属于动物类,那我们就知道X有眼睛有嘴;同样,我们通过Class类也可以知道任何一个类的属性和方法。

 

Class<T>  可以是任何类的类型,如:String.class 的类型是 Class<String>,如果构建的类未知,也可以用Class<?>表示。

 

Class类没有公共的构造方法。Class对象是在加载类时由Java虚拟机以及通过类加载器自动构造的。

 

获取Class类的对象的过程其实就是反射。

 

三、反射的应用

列举三个我们常用的方法:

 

(1)、类名.class

(2)Class.forName(包名.类名)

(3)、通过对象名.getClass()

 

在得到Class类的对象(我们常定义为clazz)后,就可以获取该类相应的方法和属性了。

 

这个在JDKAPI中都有,我列举几个常用的方法如下:

 

    1)、getConstructor() 获取构造函数

    (2)、getMethod()  获取成员方法

    (3)、getField() 获取成员变量

   

    (4)、getDeclaredConstructor() 获取私有的构造函数

    (5)、getDeclaredMethod()  获取私有的成员方法(即不包括继承的方法)

    (6)、getDeclaredField() 获取私有的成员变量(即不包括继承的属性)

 注:以上方法名加s后获取的是相应的数组对象,如Method[]。

 

(7)isArray()  判断此class对象是否表示一个数组类,返回boolean

(8)isAnnotation() 判断是否表示一个注解,返回boolean

 

 

其实,java中反射无处不在,常用的框架如springstrutshibernate等在底层都用到了反射,感兴趣的朋友可以研究一下。万变不离其宗,要想用好反射,就是抓住反射的本质,加深对Class类的理解,在业务需求中果断灵活的运用。

 

 

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics