java學習之 反射機制

參考自 http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html html


Java反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲Java語言的反射機制。反射的概念是由Smith在1982年首次提出的,主要是指程序能夠訪問、檢測和修改它自己狀態或行爲的一種能力。這一律唸的提出很快引起了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所採用,並在Lisp和麪向對象方面取得了成績。固然反射自己並非一個新概念,它可能會使咱們聯想到光學中的反射概念,儘管計算機科學賦予了反射概念新的含義,可是,從現象上來講,它們確實有某些相通之處,這些有助於咱們的理解。java

Java反射機制主要提供下面幾種用途:ide

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

    在運行時構造任意一個類的對象設計

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

    在運行時調用任意一個對象的方法htm


使用java的反射機制,通常須要遵循三步:對象

    1. 得到你想操做類的Class對象blog

        Class<?> cls = Class.forName(「java.lang.String」);// 得到Class接口

    2. 經過第一步得到的Class對象去取得操做類的方法或是屬性名

        Method[] methods = cls.getMethods();// 經過Class得到所對應對象的方法

        Method method = cls.getMethod("show", String.class);// 經過Class得到DisPlay類的show方法   

        Field[] fromFields = cls.getDeclaredFields();// 取得拷貝源對象的屬性列表

    3. 操做第二步取得的方法或是屬性

        method.invoke(disPlay, "Wanggc");// 調用show方法

        String name = fromField.getName();// 取得拷貝源對象的屬性名字

        fromField.get(from)// 獲取拷貝源對象的屬性的值

        Field destField = destClass.getDeclaredField(name);// 取得拷貝目標對象的相同名稱的屬性

        destField.set(obj, fromField.get(from));// 將拷貝源對象的屬性的值賦給拷貝目標對象相應的屬性

        fromField.setAccessible(true);// 設置屬性的可訪問性

        destField.setAccessible(true);


Java運行的時候,某個類不管生成多少個對象,他們都會對應同一個Class對象,它表示正在運行程序中的類和接口。如何取得操做類的Class對象,經常使用的有三種方式:

    1. 調用Class的靜態方法forName,如上例;

    2. 使用類的.class語法,如:Class<?> cls = String.class;

    3. 調用對象的getClass方法,如:String str = "abc";Class<?> cls = str .getClass();

相關文章
相關標籤/搜索