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