`
汾水边的意气少年
  • 浏览: 7621 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

     

                 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