Java 反射機制

反射(Reflection)是java語言的一個特性锣杂,它允程序在運行時來進行自我檢查并且對內部的成員進行操作。一個常見的例子是在JavaBean中洞坑,一些組件可以通過一個構造器來操作耳高。這個構造器就是用的反射在動態(tài)加載的時候來獲取的java中類的屬性的。

反射相關的包

java.lang.reflect
java.lang.Class(反射的開始)

通過反射了解類

給定一個類或者對象蕊爵,通過反射機制可以動態(tài)的
了解類的屬性,方法桦山,構造函數
創(chuàng)建對象
調用方法
改寫屬性

應用場景

運行時攒射,動態(tài)的情況下應對外面?zhèn)魅氲念惷瑢ο髮嵗?br> 只知道類名字符串
通常應用到框架中

反射的開始:類類型 Class Class

java中有一個類很特殊恒水,就是Class類会放,這個類是有JVM來創(chuàng)建的,所以我們就不用麻煩了钉凌。如果我們拿到一個類的類型信息咧最,就可以利用反射獲取其各種成員以及方法了。
在沒有對象實例的時候,主要有三種辦法矢沿。

System.out.println("Method 1:"); //通過一個實例來獲得
class Class dog=new Dog().getClass(); 
System.out.println(dog.getName()); 

System.out.println("Method 2:"); //通過className來獲得 
Class c=Class.forName(className); 

System.out.println("Method 3:"); //通過已知的類獲取class 
Class b=Dog.class; 

注意:第二種方式中滥搭,forName中的參數一定是完整的類名(包名+類名)咨察,并且這個方法需要捕獲異常论熙。
現(xiàn)在得到Class就可以創(chuàng)建一個對象的實例了福青,利用Class的newInstance方法相當于調用類的默認的構造器摄狱。

//方法一 :調用類的空構造方法
Object o=dogClazz.newInstance(); 
System.out.println("創(chuàng)建的對象是:");
System.out.println(o); 
//方法二 :使用有參數的構造方法:Constructor類,這個類用來封裝反射得到的構造器
Constructor c=dogClazz.getConstructor(new Class[]{String.class,int.class});
Object o2=c.newInstance("大黃",5);
獲取類的成員變量

成員變量用Field類進行封裝无午,主要的方法非常的類似:
public [Field] getDeclaredField([String]) 獲取任意指定名字的成員
public [Field][] getDeclaredFields() 獲取所有的成員變量
public [Field] getField([String] name) 獲取任意public成員變量
public [Field][] getFields() 獲取所有的public成員變量

注意媒役,以上的四個方法全部需要拋出異常,當我們獲得私有的方法的時候宪迟,要用setAccessible設置一下可訪問的權限酣衷。

Object o = dogClazz.newInstance();
System.out.println("通過空的構造函數創(chuàng)建的對象是"+ o);
Field[] fields=dogClazz.getFields();
for(Field f:fields){
      System.out.println(f.getName());          
}
Field f = dogClazz.getField("name");
f.set(o, "hisdog");
f.get(o);

獲取類的方法

封裝類的方法的類是Method.獲取method也有四個方法
public [Method][] getMethods() 獲取所有的共有方法的集合
**public [Method] getMethod([String] name,[Class]<?>... parameterTypes) 獲取指定公有方法 參數1:方法名 參數2:參數類型集合 **
public [Method][] getDeclaredMethods() 獲取所有的方法
public [Method] getDeclaredMethod([String] name,[Class]<?>... parameterTypes) 獲取任意指定方法

Object o = dogClazz.newInstance();
System.out.println("通過空的構造函數創(chuàng)建的對象是"+ o);
Method m=dogClazz.getMethod("bark", new Class[]{});
m.invoke(o, new Object[]{});

注意:在獲取類和成員變量時若含有Declared的方法,是獲得自定義的目標

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末次泽,一起剝皮案震驚了整個濱河市穿仪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌意荤,老刑警劉巖啊片,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玖像,居然都是意外死亡紫谷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門捐寥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笤昨,“玉大人,你說我怎么就攤上這事握恳÷髦希” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵乡洼,是天一觀的道長崇裁。 經常有香客問我,道長就珠,這世上最難降的妖魔是什么寇壳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮妻怎,結果婚禮上壳炎,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好匿辩,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布腰耙。 她就那樣靜靜地躺著,像睡著了一般铲球。 火紅的嫁衣襯著肌膚如雪挺庞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天稼病,我揣著相機與錄音选侨,去河邊找鬼。 笑死然走,一個胖子當著我的面吹牛援制,可吹牛的內容都是我干的。 我是一名探鬼主播芍瑞,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼晨仑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拆檬?” 一聲冷哼從身側響起洪己,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竟贯,沒想到半個月后答捕,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡澄耍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年噪珊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片齐莲。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡痢站,死狀恐怖,靈堂內的尸體忽然破棺而出选酗,到底是詐尸還是另有隱情阵难,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布芒填,位于F島的核電站呜叫,受9級特大地震影響,放射性物質發(fā)生泄漏殿衰。R本人自食惡果不足惜朱庆,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闷祥。 院中可真熱鬧娱颊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剧罩,卻和暖如春栓拜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惠昔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工幕与, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舰罚。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓纽门,卻偏偏與公主長得像,于是被迫代替她去往敵國和親营罢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容