java反射-第一篇

一啰脚、什么是反射

所謂的反射簡(jiǎn)單來(lái)說(shuō)就是在程序運(yùn)行中询张,動(dòng)態(tài)的獲取一個(gè)類(lèi)的信息,并進(jìn)行操作戒幔。

二吠谢、怎樣動(dòng)態(tài)獲取到類(lèi)信息

?有三種方式

1、

System.out.println("-----第一種反射方式------------------");

FanSheClass fs = new FanSheClass();

Class c1 = fs.getClass();

System.out.println(c1.getName());

2诗茎、

System.out.println("-----第二種反射方式------------------");

Class c2 = FanSheClass.class;

System.out.println(c2.getName());

3工坊、

System.out.println("-----第三種反射方式------------------");

Class c3 = null;

try {

c3 = Class.forName("com.w.test.fanshe.FanSheClass");

System.out.println(c3.getName());

}

catch(e){

}

三種方式各有利弊,第一種方式有點(diǎn)畫(huà)蛇添足的意思敢订,都new出來(lái)了王污,還反射干嘛,暫時(shí)想不到有什么用楚午;第二種方式需要引入包昭齐;第三種方式使用比較普遍

三、操作

package com.w.test.fanshe;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class Enter {

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println("-----第一種反射方式------------------");

FanSheClass fs = new FanSheClass();

Class c1 = fs.getClass();

System.out.println(c1.getName());

System.out.println("-----第二種反射方式------------------");

Class c2 = FanSheClass.class;

System.out.println(c2.getName());

System.out.println("-----第三種反射方式------------------");

Class c3 = null;

try {

c3 = Class.forName("com.w.test.fanshe.FanSheClass");

System.out.println(c3.getName());

System.out.println("-----獲取全部構(gòu)造方法------------------");

Constructor[]? constructors = c3.getConstructors();

for (Constructor constructor : constructors) {

System.out.println(constructor);

}

System.out.println("-------獲取類(lèi)屬性--------------------------------");

System.out.println("-------獲取所有的公共字段--------------------------------");

Field[] fields = c3.getFields();

for (Field field : fields) {

System.out.println(field);

}

System.out.println("-------獲取所有的字段,公共的私有的--------------------------------");

Field[] fields2 = c3.getDeclaredFields();

for (Field field : fields2) {

System.out.println(field);

}

System.out.println("-------獲取公有字段并使用--------------------------------");

//獲取指定公有字段

Field field = c3.getField("two");

//獲取一個(gè)公共構(gòu)造方法并且示例化

Object obj = c3.getConstructor().newInstance();

//為屬性設(shè)定值

field.set(obj, 1111);

FanSheClass fanshe = (FanSheClass) obj;

int two = fanshe.getTwo();

System.out.println(two);

System.out.println("-------獲取私有字段并使用--------------------------------");

//獲取指定私有字段

Field fieldPrivate = c3.getDeclaredField("one");

//獲取構(gòu)造函數(shù)矾柜,實(shí)例化對(duì)象

Object objp = c3.getConstructor().newInstance();

//暴力反射? 獲取私有變量的時(shí)候這個(gè)必須

fieldPrivate.setAccessible(true);

//給屬性設(shè)置值

fieldPrivate.set(objp, 222);

//測(cè)試

FanSheClass fanshe2 = (FanSheClass) objp;

int one = fanshe2.getOne();

System.out.println(one);

System.out.println("-------獲取特定方法帶參數(shù)并使用------后邊帶的參數(shù)與方法參數(shù)一致--------------------------");

Method method1 = c3.getMethod("test1", String.class);

Method method2 = c3.getMethod("test5", int.class);

System.out.println(method1);

System.out.println(method2);

System.out.println("-------獲取特定方法不帶參數(shù)并使用--------------------------------");

Method method3 = c3.getDeclaredMethod("test2");

System.out.println(method3);

System.out.println("--------獲取特定方法帶多個(gè)參數(shù)并使用--------------------------------------");

Method method4 = c3.getDeclaredMethod("test4",String.class,String.class,int.class);

//獲取構(gòu)造方法實(shí)例化一個(gè)對(duì)象

Object obj3 = c3.getConstructor().newInstance();

//給方法傳值

Object invoke = method4.invoke(obj3,"33","44",55);

//測(cè)試

System.out.println(invoke);

System.out.println("-----------反射調(diào)用main方法------注意String的包--------------");

//獲取class對(duì)象

Class c4 = Class.forName("com.w.test.main.Enter");

//獲取main方法

Method method = c4.getMethod("main",java.lang.String[].class);

//調(diào)用

Object obj4 = method.invoke(null,(Object)new String[] {"a"});

System.out.println(obj4);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

實(shí)體類(lèi):

package com.w.test.fanshe;

public class FanSheClass {

private int one;

public int two;

public static int four;

String three;

public int getTwo() {

return two;

}

public void setTwo(int two) {

this.two = two;

}

public void test1(String aa) {

System.out.println(aa);

}

public void test5(int aa) {

System.out.println(aa);

}

public String test4(String aa, String nn, int cc) {

System.out.println(aa + nn + cc);

return aa + nn + cc;

}

public String test2() {

return "111";

}

String test3() {

return "222";

}

public int getOne() {

return one;

}

public void setOne(int one) {

this.one = one;

}

}

五阱驾、應(yīng)用場(chǎng)景

不全,只是我在開(kāi)發(fā)中用到的場(chǎng)景

1怪蔑、一個(gè)接口有多個(gè)實(shí)現(xiàn)類(lèi)啊易,根據(jù)傳入的值不同選擇不同的實(shí)現(xiàn)類(lèi),可以使用反射獲取出實(shí)現(xiàn)類(lèi)

參考:

https://baijiahao.baidu.com/s?id=1619748187138646880&wfr=spider&for=pc

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饮睬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子篮奄,更是在濱河造成了極大的恐慌捆愁,老刑警劉巖割去,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昼丑,居然都是意外死亡呻逆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)菩帝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咖城,“玉大人,你說(shuō)我怎么就攤上這事呼奢∫巳福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵握础,是天一觀的道長(zhǎng)辐董。 經(jīng)常有香客問(wèn)我,道長(zhǎng)禀综,這世上最難降的妖魔是什么简烘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮定枷,結(jié)果婚禮上孤澎,老公的妹妹穿的比我還像新娘。我一直安慰自己欠窒,他們只是感情好覆旭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贱迟,像睡著了一般姐扮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衣吠,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天茶敏,我揣著相機(jī)與錄音,去河邊找鬼缚俏。 笑死惊搏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忧换。 我是一名探鬼主播恬惯,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亚茬!你這毒婦竟也來(lái)了酪耳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碗暗,沒(méi)想到半個(gè)月后颈将,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡言疗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年晴圾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噪奄。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡死姚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勤篮,到底是詐尸還是另有隱情都毒,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布叙谨,位于F島的核電站温鸽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏手负。R本人自食惡果不足惜涤垫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竟终。 院中可真熱鬧蝠猬,春花似錦、人聲如沸统捶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喘鸟。三九已至匆绣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間什黑,已是汗流浹背崎淳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愕把,地道東北人拣凹。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恨豁,于是被迫代替她去往敵國(guó)和親嚣镜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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