<!--[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)后,就可以获取该类相应的方法和属性了。
这个在JDK的API中都有,我列举几个常用的方法如下:
(1)、getConstructor() 获取构造函数
(2)、getMethod() 获取成员方法
(3)、getField() 获取成员变量
(4)、getDeclaredConstructor() 获取私有的构造函数
(5)、getDeclaredMethod() 获取私有的成员方法(即不包括继承的方法)
(6)、getDeclaredField() 获取私有的成员变量(即不包括继承的属性)
注:以上方法名加s后获取的是相应的数组对象,如Method[]。
(7)、isArray() 判断此class对象是否表示一个数组类,返回boolean
(8)、isAnnotation() 判断是否表示一个注解,返回boolean
其实,java中反射无处不在,常用的框架如spring、struts、hibernate等在底层都用到了反射,感兴趣的朋友可以研究一下。万变不离其宗,要想用好反射,就是抓住反射的本质,加深对Class类的理解,在业务需求中果断灵活的运用。