java反射機制

1.反射的定義

反射是:指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力
在java中反射主要通過以下兩個java特性來完成工作的涝开。

  • Class 類
  • java.lang.reflect field method constructor

在java中我們常用反射做以下的事情

  • 獲取類型的相關信息
  • 動態(tài)調用方法
  • 動態(tài)構造對象
  • 從程序集中獲得類型剪个。

2. 反射的原理

java類加載

一段代碼要想在java中執(zhí)行,首先要把java源碼(.java文件)進行編譯從而生成機器碼(.class文件)耗帕,然后class文件會經(jīng)過類加載器加載到內(nèi)存中另玖,并在啟動main方法時候執(zhí)行佣赖。

在類加載過程中恰矩,ClassLoader會把類的引用加載到類方法區(qū),并且在堆內(nèi)存建立Class對象保存文件中的Class信息憎蛤。這個不是new出來的對象外傅,而是類的類型對象,每個類只有一個class對象蹂午,作為方法區(qū)類的數(shù)據(jù)結構的接口栏豺。jvm創(chuàng)建對象前,會先檢查類是否加載豆胸,尋找類對應的class對象奥洼,若加載好,則為你的對象分配內(nèi)存晚胡,初始化灵奖。

使用反射的好處是,你不必在jvm啟動的時候就知道所有可能需要的類的信息估盘,而是在程序運行過程中瓷患,根據(jù)程序的需要,動態(tài)加載類的信息遣妥,和在程序運行過程中動態(tài)獲取類的信息擅编,而且由于加載的是class文件,并且沒有規(guī)定這個文件的來源箫踩,所以可以從網(wǎng)絡爱态,數(shù)據(jù)庫等地方動態(tài)加載java信息。

最常用的地方應該就是java使用數(shù)據(jù)庫時候境钟,根據(jù)選擇的數(shù)據(jù)庫種類锦担,動態(tài)加載數(shù)據(jù)庫的驅動程序,而不是首先就建立所有數(shù)據(jù)庫驅動的對象慨削。

3. 實例

包括構造方法洞渔、屬性套媚、方法的獲取,以及方法的調用磁椒。

測試類

package com.reflect;


public class ReflectTest {

    private int age = 10;

    public String name = "1234";

    public ReflectTest(int age){
        this.age = age;
    }

    public ReflectTest(int age, String name){
        this.age = age;
        this.name = name;
    }

    public void disPlay(String dispaly){
        System.out.println("The display method is execute!"+dispaly);
    }

    public void getName(String name){
        System.out.println("The getName method is execute!");
    }

}

反射類

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        ReflectTest obj = new ReflectTest(12);
        Class clazz = obj.getClass();    //獲取這個對象的class對象
        Constructor[] constructors = clazz.getConstructors();  //獲取所有構造方法
        Field[] fields = clazz.getDeclaredFields(); //獲取所有屬性(包括私有屬性),非declare獲取非私有
        Method[] methods = clazz.getDeclaredMethods(); //獲取所有方法(包括私有方法),非declare獲取非私有
        System.out.println("All Construct is: ");
        for(Constructor constructor:constructors){
            System.out.println(constructor.getName()+"  "+constructor.getParameterTypes());
        }
        System.out.println("All Fields is: ");
        for(Field field:fields){
            System.out.println(field.getName());
        }
        System.out.println("All  Method is: ");
        for(Method method:methods){
            System.out.println(method.getName());
        }
        //開源框架中常用反射機制以及invoke配合來完成某些工作堤瘤。
        //第一個參數(shù)是具體調用該方法的對象
        //第二個參數(shù)是執(zhí)行該方法的具體參數(shù)
        Object[] objects = new String[1];
        objects[0] = "123";
        System.out.println("Begin to execute method by invoke");
        for(Method method:methods){
            method.invoke(obj, objects);
        }
    }
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市衷快,隨后出現(xiàn)的幾起案子宙橱,更是在濱河造成了極大的恐慌姨俩,老刑警劉巖蘸拔,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異环葵,居然都是意外死亡调窍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門张遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邓萨,“玉大人,你說我怎么就攤上這事菊卷〉蘅遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵洁闰,是天一觀的道長歉甚。 經(jīng)常有香客問我,道長扑眉,這世上最難降的妖魔是什么纸泄? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腰素,結果婚禮上聘裁,老公的妹妹穿的比我還像新娘。我一直安慰自己弓千,他們只是感情好衡便,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洋访,像睡著了一般镣陕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捌显,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天茁彭,我揣著相機與錄音,去河邊找鬼扶歪。 笑死理肺,一個胖子當著我的面吹牛摄闸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妹萨,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼年枕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乎完?” 一聲冷哼從身側響起熏兄,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎树姨,沒想到半個月后摩桶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡帽揪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年硝清,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片转晰。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡芦拿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出查邢,到底是詐尸還是另有隱情蔗崎,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布扰藕,位于F島的核電站缓苛,受9級特大地震影響,放射性物質發(fā)生泄漏实胸。R本人自食惡果不足惜他嫡,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庐完。 院中可真熱鬧钢属,春花似錦、人聲如沸门躯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讶凉。三九已至染乌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂讯,已是汗流浹背荷憋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褐望,地道東北人勒庄。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓串前,卻偏偏與公主長得像,于是被迫代替她去往敵國和親实蔽。 傳聞我的和親對象是個殘疾皇子荡碾,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容