java語言區(qū)別于C,C++等準靜態(tài)語言的最大特點就是java的反射機制。靜態(tài)語言的最直接定義就是不能在運行時改變程序結(jié)構(gòu)或變量的類型.按照這樣的定義,python,ruby是動態(tài)語言,C,C++,Java不是動態(tài)語言。雖然在這樣的定義下java不是動態(tài)語言,但java的反射機制(Reflection)卻是可實現(xiàn)動態(tài)的相關(guān)機制。java反射機制的作用有
1、在運行時判斷任意一個類所具有的成員變量和方法
2、在運行時構(gòu)造任意一個類的對象
3、在運行時判斷任意一個對象所屬的類
4、在運行時調(diào)用任意一個對象的方法
在java的jdk中,有java.lang.reflect包,在該包中有5個比較重要的類,
1、Class類:代表一個類。
2、Constructor類:表示類的構(gòu)造方法,通過該類來操作構(gòu)造方法
3、Field類:代表類的成員變量(屬性)。
4、Method類:代表類的方法。通過該類可操作方法。
5、Array類:提供了動態(tài)創(chuàng)建數(shù)組,以及訪問數(shù)組的元素的靜態(tài)方法。
Class 類十分特殊。它和一般類一樣繼承自O(shè)bject,當(dāng)一個class被加載,或當(dāng)加載器(class loader)的defineClass()被JVM調(diào)用,JVM 便自動產(chǎn)生一個Class 對象。Class并沒有構(gòu)造方法,不能人為生成。
要想使用java的反射,首先要獲得類的Class,而獲得的方法有以下幾種
String str = "CIACs";
1、Class c1 = str.getClass();
2、Class c2 = Class.forName("java.lang.String");//調(diào)用Class的靜態(tài)方法
3、Class c3 = String.class;//每個包裝類都有自身的class
獲得Class后,就可以生成對象了,對象的構(gòu)造方法有帶參數(shù)的和不帶參數(shù)的,當(dāng)通過不帶參數(shù)的構(gòu)造方法來生成對象時有以下兩種方式
1、通過newInstance()方法生成
Class<?> classType = str.getClass();
Object obj = classType.newInstance();
2、通過構(gòu)造方法實現(xiàn)
Class<?> classType = str.getClass();
Constructor con = classType.getConstructor(new Class[]{});
Object obj = con.newInstance(new Object[]{});
若要通過帶參數(shù)的構(gòu)造方法生成對象實例,就只能使用如下方法
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});//傳入?yún)?shù)調(diào)用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} |
運行結(jié)果:
java學(xué)習(xí)中反射機制跟動態(tài)代理相關(guān),動態(tài)代理也是java中的重要知識。