在Java運(yùn)行時(shí)環(huán)境中,對(duì)于任意一個(gè)類(lèi),能否知道這個(gè)類(lèi)有哪些屬性和方法?對(duì)于任意一個(gè)對(duì)象,能否調(diào)用它的任意一個(gè)方法?答案是肯定的。這種動(dòng)態(tài)獲取類(lèi)的信息,以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能來(lái)自于Java語(yǔ)言的反射(Reflection)機(jī)制。Java反射機(jī)制主要提供以下功能:
[*]在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi);
[*]在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象;
[*]在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的成員變量和方法;
[*]在運(yùn)行時(shí)調(diào)用任意一個(gè)類(lèi)的方法;
[*]生成動(dòng)態(tài)代理;
在JDK中,主要由以下類(lèi)來(lái)實(shí)現(xiàn)Java反射機(jī)制,這些類(lèi)都位于 java.lang.reflect 包中。
[*] Class 類(lèi):代表一個(gè)類(lèi)。
[*] Field 類(lèi):代表類(lèi)的成員變量
[*] Method 類(lèi):代表類(lèi)的方法
[*] Constructor 類(lèi):代表類(lèi)的構(gòu)造方法
[*] Array 類(lèi):提供了動(dòng)態(tài)創(chuàng)建數(shù)組,以及訪問(wèn)數(shù)組元素的靜態(tài)方法
看看下面例子:它讀取命令行參數(shù)指定的類(lèi)名,然后打印這個(gè)類(lèi)的所具有的方法信息:
1 import java.lang.reflect.*;
2 public class DumpMethods{
3 public static void main(String[] args)thorws Exception{
4 //加載并初始化命令行參數(shù)指定的類(lèi)
5 Class classType = Class.forName(args[0]);
6 //獲得類(lèi)的所有方法
7 Method[] methods = classType.getDeclaredMethods();
8 for(int i=0;i<methods.length;i++){
9 System.out.println(methods[i].toString());
10 }
11 }
12 }
運(yùn)行命令 “java DumpMethods java.util.Stack”,就會(huì)顯示java.util.Stack 類(lèi)所具有的方法。
這個(gè)只是十分之基本,很簡(jiǎn)單的示例,Java的反射還可以做很多東西,可以跟據(jù)用戶的輸入就可以得知哪些類(lèi),需要做什么操作,就是說(shuō)動(dòng)態(tài)跟據(jù)需要來(lái)調(diào)用相應(yīng)的類(lèi)與相應(yīng)的方法,我之前也做過(guò),用Struts結(jié)合Java反射來(lái)實(shí)現(xiàn)一些功能,有些時(shí)候,別人的接口代碼里只返回一個(gè)Object給你,而你就要用反射來(lái)得知該Object是屬于哪一個(gè)類(lèi)型,之后根據(jù)設(shè)置做相應(yīng)的操作,不知道大家有用過(guò)Hibernate沒(méi)有,這個(gè)框架就是大量用到了Java反射,用戶只需配置一下XML文件,Hibernate運(yùn)行時(shí),就會(huì)讀取解析XML配置文件,之后動(dòng)態(tài)找相應(yīng)的類(lèi),實(shí)例化相應(yīng)的POJO等等,這些都是全動(dòng)態(tài)化的,也就是說(shuō),我請(qǐng)求這個(gè)表的數(shù)據(jù)時(shí),就自動(dòng)實(shí)例化該表的POJO實(shí)例,這些都是在XML配置文件里定義好映射關(guān)系。ORM框架就如此,很多中間件也是大量使用反射,將反射靈活的運(yùn)用起來(lái),將會(huì)得到意想不到的效果,這也是Java的半動(dòng)態(tài)語(yǔ)言吧。使編程工作變得十分靈活。
posted on 2008-07-29 13:00
姜大叔 閱讀(287)
評(píng)論(1) 編輯 收藏 所屬分類(lèi):
Java