Java學習之反射機制
java語言區別于C,C++等準靜態語言的最大特點就是java的反射機制。靜態語言的最直接定義就是不能在運行時改變程序結構或變量的類型.按照這樣的定義,python,ruby是動態語言,C,C++,Java不是動態語言。雖然在這樣的定義下java不是動態語言,但java的反射機制(Reflection)卻是可實現動態的相關機制。java反射機制的作用有
1、在運行時判斷任意一個類所具有的成員變量和方法
2、在運行時構造任意一個類的對象
3、在運行時判斷任意一個對象所屬的類
4、在運行時調用任意一個對象的方法
在java的jdk中,有java.lang.reflect包,在該包中有5個比較重要的類,
1、Class類:代表一個類。
2、Constructor類:表示類的構造方法,通過該類來操作構造方法
3、Field類:代表類的成員變量(屬性)。
4、Method類:代表類的方法。通過該類可操作方法。
5、Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法。
Class 類十分特殊。它和一般類一樣繼承自Object,當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class 對象。Class并沒有構造方法,不能人為生成。
要想使用java的反射,首先要獲得類的Class,而獲得的方法有以下幾種
String str = "CIACs";
1、Class c1 = str.getClass();
2、Class c2 = Class.forName("java.lang.String");//調用Class的靜態方法
3、Class c3 = String.class;//每個包裝類都有自身的class
獲得Class后,就可以生成對象了,對象的構造方法有帶參數的和不帶參數的,當通過不帶參數的構造方法來生成對象時有以下兩種方式
1、通過newInstance()方法生成
Class<?> classType = str.getClass();
Object obj = classType.newInstance();
2、通過構造方法實現
Class<?> classType = str.getClass();
Constructor con = classType.getConstructor(new Class[]{});
Object obj = con.newInstance(new Object[]{});
若要通過帶參數的構造方法生成對象實例,就只能使用如下方法
Class<?> classType = str.getClass();
Constructor con = classType.getConstructor(new Class[]{String.class});
Object obj = con.newInstance(new Object[]{"CIACs"});
獲得類的對象實例后就可以操作對象的方法和屬性了。以下是一個例子
1packagereflection; 2 3importjava.lang.reflect.InvocationTargetException; 4importjava.lang.reflect.Method; 5 6publicclassTestClass{ 7 8publicintadd(inta,intb) 9{ 10returna+b; 11} 12 13publicStringecho(Stringstr) 14{ 15returnstr; 16} 17 18publicstaticvoidmain(String[]args)throwsException{ 19Class<?>classType=TestClass.class;//獲得Class 20 21ObjectTest=classType.newInstance();//通過classType獲得對象實例 22 23MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//運行中獲得add方法 24 25Objectresult=addMethod.invoke(Test,newObject[]{1,2});//傳入參數調用add方法 26 27System.out.println((Integer)result); 28 29MethodechoMethod=classType.getMethod("echo",newClass[]{String.class}); 30 31Objectresult2=echoMethod.invoke(Test,newObject[]{"http://www.cnblogs.com/zhi-hao/"}); 32 33System.out.println(result2); 34 35} 36 37} |
運行結果:
java學習中反射機制跟動態代理相關,動態代理也是java中的重要知識。
posted on 2014-09-12 09:56 順其自然EVO 閱讀(186) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄