java學習之反射機制

java語言區別於C,C++等準靜態語言的最大特色就是java的反射機制。靜態語言的最直接定義就是不能在運行時改變程序結構或變量的類型.按照這樣的定義,python,ruby是動態語言,C,C++,Java不是動態語言。雖然在這樣的定義下java不是動態語言,但java的反射機制(Reflection)倒是可實現動態的相關機制。java反射機制的做用有java

一、在運行時判斷任意一個類所具備的成員變量和方法python

二、在運行時構造任意一個類的對象數組

三、在運行時判斷任意一個對象所屬的類ruby

四、在運行時調用任意一個對象的方法ide

在java的jdk中,有java.lang.reflect包,在該包中有5個比較重要的類,學習

一、Class類:表明一個類。spa

二、Constructor類:表示類的構造方法,經過該類來操做構造方法3d

三、Field類:表明類的成員變量(屬性)。代理

四、Method類:表明類的方法。經過該類可操做方法。code

五、Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法。

Class 類十分特殊。它和通常類同樣繼承自Object,當一個class被加載,或當加載器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class 對象。Class並無構造方法,不能人爲生成。
 
要想使用java的反射,首先要得到類的Class,而得到的方法有如下幾種
String str = "CIACs";
一、Class c1 = str.getClass();
二、Class c2 = Class.forName("java.lang.String");//調用Class的靜態方法
三、Class c3 = String.class;//每一個包裝類都有自身的class
 
得到Class後,就能夠生成對象了,對象的構造方法有帶參數的和不帶參數的,當經過不帶參數的構造方法來生成對象時有如下兩種方式
一、經過newInstance()方法生成
Class<?> classType = str.getClass();
 Object obj = classType.newInstance();
二、經過構造方法實現
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"});
 
得到類的對象實例後就能夠操做對象的方法和屬性了。如下是一個例子
 1 package reflection;
 2 
 3 import java.lang.reflect.InvocationTargetException;
 4 import java.lang.reflect.Method;
 5 
 6 public class TestClass {
 7     
 8     public int add(int a,int b)
 9     {
10         return a+b;
11     }
12     
13     public String echo(String str)
14     {
15         return str;
16     }
17     
18     public static void main(String[] args) throws Exception {
19         Class<?> classType = TestClass.class;//得到Class
20 
21         Object Test = classType.newInstance();//經過classType得到對象實例
22 
23         Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class});//運行中得到add方法
24 
25         Object result = addMethod.invoke(Test, new Object[]{1,2});//傳入參數調用add方法
26 
27         System.out.println((Integer)result);
28         
29         Method echoMethod = classType.getMethod("echo",new Class[]{String.class});
30 
31         Object result2 = echoMethod.invoke(Test, new Object[]{"http://www.cnblogs.com/zhi-hao/"});
32 
33         System.out.println(result2);
34         
35     }
36 
37 }
TestClass

 

運行結果:
 
java反射甚至能夠經過壓制java的訪問控制,改變私有的成員變量。
 
java學習中反射機制跟動態代理相關,動態代理也是java中的重要知識。
相關文章
相關標籤/搜索