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