JAVA高級(9)—— 反射

反射的基石-Class類

  • Java程序中的各個(gè)Java類屬于同一類事物因块,描述這類事物的Java類名就是Class揍堰。
  • Class類描述了類的名稱,類的屬性诗轻,所屬的包,方法名稱等
  • Classs類的實(shí)例對象:對應(yīng)各個(gè)類在內(nèi)存中的字節(jié)碼揭北,然后用該字節(jié)碼去創(chuàng)建多個(gè)實(shí)例對象扳炬。

三種得到字節(jié)碼對應(yīng)的實(shí)例對象
a)Class cls1 = Date.class;
b)Date d1 = new Date(); Class cls2 = d1.getClass();
c)Class.forName("java.lang.String"); //主要用這種比較多,參數(shù)可以通過配置文件配置搔体。forName的作用:返回字節(jié)碼恨樟。兩種方式:若不在內(nèi)存中,用類加載器加載到內(nèi)存中疚俱;已在內(nèi)存中劝术,直接返回。

  • 9個(gè)預(yù)定義的Class類的實(shí)例對象(8個(gè)基本類型+1個(gè)Void)
    a)int.class == Integer.Type --包裝的基本類型的字節(jié)碼void.class
    b)程序中出現(xiàn)的類型呆奕,都有對應(yīng)的Class實(shí)例對象(字節(jié)碼)养晋,例如:int[],void

Class類的方法

  • isPrimitive() //是否是基本類型
  • isArray() //是否為數(shù)組
  • getConstructors() Constructor[] //得到所有的構(gòu)造方法
  • getConstructor(Class<?>... paramType) //得到某個(gè)構(gòu)造方法
  • getMethod(str,Class ...) //返回公共方法;str:方法名梁钾;Classs ... :參數(shù)列表绳泉,獲得的是類上的方法
  • newInstance() //調(diào)用該字節(jié)碼的無參的構(gòu)造方法
  • getField(str) Field //返回類中可見的某個(gè)變量,類似getFields()姆泻;不是對象身上的變量零酪,而是類上的 變量,再調(diào)用get(obj)拇勃,調(diào)用具體的某個(gè)對象的變量的值
  • getDeclaredField(str) Field //返回類中的某個(gè)變量
  • getSuperclass() Class //獲取父類
  • getClassLoader().getResourceAsStream(String name) InputStream //加載文件到內(nèi)存
  • getResourceAsStream(String name) InputStream //加載文件到內(nèi)存

反射

把Java類中的各種成分映射成相應(yīng)的Java類四苇,如:Method,Constructor方咆,Package月腋,F(xiàn)ield等。

  • 一個(gè)類中的每個(gè)成員都可以用相應(yīng)的反射API類的一個(gè)實(shí)例對象來表示。
  • 反射會導(dǎo)致程性能下降(先獲得Constructor實(shí)例對象保存到內(nèi)存中)

Constructor類

  • 得到某類所有的構(gòu)造方法Constructor[] cons = String.class.getConstructors();
  • 得到某個(gè)具體的構(gòu)造方法Constructor[] cons = String.class.getConstructor(StringBuffer.class);
  • Constructor類的方法:newInstance(Object... obj) //調(diào)用某個(gè)構(gòu)造方法來創(chuàng)建實(shí)例對象罗售,對比Class.newInstance()
    Constructor cons = String.class.getConstructor(StringBuffer.class); //用到類型
    String str = (String)cons.newInstance(new StringBuffer("abc")); //用到這個(gè)類型的對象辜窑;必須一致

Field類

  • get(obj) Object //返回obj對象上對應(yīng)變量的值
  • set(obj,str)
  • setAccessible(boolean) //是否允許訪問,如果是私有的變量寨躁,盡管getDeclaredField可以得到穆碎,但是不設(shè)置為true,還是會報(bào)錯(cuò)
  • getType() Class<?>//獲取成員變量的字節(jié)碼(Class類的實(shí)例對象)

Method

  • invoke(obj,obj ... ) //obj:某個(gè)對象的這個(gè)方法职恳;obj ... :方法傳遞的參數(shù)所禀;關(guān)門的這個(gè)方法應(yīng)該是在門身上,而不是人放钦;變量在誰身上色徘,就該由誰來操作;invoke(null操禀,obj ....) 調(diào)用的是靜態(tài)方法

案例:啟動(dòng)java程序的main方法的參數(shù)一個(gè)字符串?dāng)?shù)組褂策,即public static void main(String[] args),用反射調(diào)用main方法颓屑,如何為invoke方法傳遞參數(shù)呢斤寂?jdk1.5語法,把整個(gè)數(shù)組當(dāng)做一個(gè)參數(shù)揪惦;jdk1.4語法遍搞,數(shù)組中的每一個(gè)元素當(dāng)做一個(gè)參數(shù),若把字符串?dāng)?shù)組傳遞給invoke方法器腋,為了兼容jdk1.4溪猿,肯定按1.4處理,所以用invoke(null,new String[]{"1","2"})報(bào)錯(cuò)
解決:invoke(null,(Object)new String[]{})或invoke(null,new Object[]{new String[]{}})

數(shù)組的反射

  • 具有相同維數(shù)和元素類型的數(shù)組屬于同一類型纫塌,即具有相同的Class實(shí)例對象(字節(jié)碼)
  • Arrays數(shù)組工具類


    輸出:



    原因:因?yàn)锳rrays.asList(T ... a) 1.5诊县,Arrays.asLiist(Object[] a) 1.4,而a4可以按照1.4處理措左,a1不能賦值給Object[ ](因?yàn)閕nt不是一個(gè)Object)翎冲,所以按照1.5處理,相當(dāng)于一個(gè)參數(shù)媳荒,所以才會出現(xiàn)這樣的打印結(jié)果
  • Array工具類用于完成對數(shù)組的反射操作
    getLength(obj) static int
    get(obj,int) static Object

HashCode

  • HashCode僅對Hash類型的集合有效
  • 通常情況下抗悍,一個(gè)類的兩個(gè)對象equals方法比較相同時(shí),它們的HashCode碼也應(yīng)該相同
  • 當(dāng)一個(gè)對象被存進(jìn)Hash類型的集合后钳枕,不要去修改對象中參與HashCode計(jì)算的字段缴渊,否則會造成HashCode不一致,無法刪除對象鱼炒,導(dǎo)致內(nèi)存泄露
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衔沼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌指蚁,老刑警劉巖菩佑,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凝化,居然都是意外死亡稍坯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門搓劫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞧哟,“玉大人,你說我怎么就攤上這事枪向∏诳” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵秘蛔,是天一觀的道長陨亡。 經(jīng)常有香客問我,道長深员,這世上最難降的妖魔是什么负蠕? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮辨液,結(jié)果婚禮上虐急,老公的妹妹穿的比我還像新娘箱残。我一直安慰自己滔迈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布被辑。 她就那樣靜靜地躺著燎悍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盼理。 梳的紋絲不亂的頭發(fā)上谈山,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音宏怔,去河邊找鬼奏路。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臊诊,可吹牛的內(nèi)容都是我干的鸽粉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼抓艳,長吁一口氣:“原來是場噩夢啊……” “哼触机!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤儡首,失蹤者是張志新(化名)和其女友劉穎片任,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔬胯,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对供,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笔宿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犁钟。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泼橘,靈堂內(nèi)的尸體忽然破棺而出涝动,到底是詐尸還是另有隱情,我是刑警寧澤炬灭,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布醋粟,位于F島的核電站,受9級特大地震影響重归,放射性物質(zhì)發(fā)生泄漏米愿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一鼻吮、第九天 我趴在偏房一處隱蔽的房頂上張望育苟。 院中可真熱鬧,春花似錦椎木、人聲如沸违柏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漱竖。三九已至,卻和暖如春畜伐,著一層夾襖步出監(jiān)牢的瞬間馍惹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工玛界, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万矾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓慎框,卻偏偏與公主長得像良狈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鲤脏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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

  • 一们颜、概述 Java反射機(jī)制定義 Java反射機(jī)制是在運(yùn)行狀態(tài)中吕朵,對于任意一個(gè)類,都能夠知道這個(gè)類中的所有屬性和方法...
    CoderZS閱讀 1,642評論 0 26
  • 一窥突、概述 1努溃、Java反射機(jī)制(Java-Reflect): 在運(yùn)行狀態(tài)中,對于任意一個(gè)類阻问,都能夠知道這個(gè)類中的所...
    年少懵懂丶流年夢閱讀 4,429評論 0 5
  • [toc] 反射機(jī)制: 允許程序在運(yùn)行時(shí)取得任何一個(gè)已知名稱的class的內(nèi)部信息梧税,容許程序在運(yùn)行時(shí)加載、探知称近、使...
    卡路fly閱讀 2,572評論 2 14
  • 基本概念 java的反射機(jī)制是動(dòng)態(tài)獲取類的信息以及動(dòng)態(tài)調(diào)用對象的方法第队。這種機(jī)制允許程序在運(yùn)行時(shí)通過reflecti...
    YONGSSU的技術(shù)站點(diǎn)閱讀 779評論 0 10
  • 一、概述 Java反射機(jī)制定義 Java反射機(jī)制是在運(yùn)行狀態(tài)中刨秆,對于任意一個(gè)類凳谦,都能夠知道這個(gè)類中的所有屬性和方法...
    Android進(jìn)階與總結(jié)閱讀 500評論 0 1