java的反射機(jī)制

什么是反射销部?

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中摸航,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法舅桩;對(duì)于任意一個(gè)對(duì)象酱虎,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語(yǔ)言的反射機(jī)制擂涛。

通過反射來了解類

1读串、類由屬性,方法撒妈,構(gòu)造函數(shù)等組成
2恢暖、給定一個(gè)類或?qū)ο螅ㄟ^反射機(jī)制可以動(dòng)態(tài)的了解類的屬性方法狰右,構(gòu)造函數(shù)杰捂,創(chuàng)建對(duì)象,調(diào)用方法棋蚌,改寫屬性
3嫁佳、應(yīng)用場(chǎng)景:(1)運(yùn)行時(shí),動(dòng)態(tài)的情況下應(yīng)對(duì)外面?zhèn)魅氲摹邦惷惫饶海瑢?duì)象實(shí)例等蒿往。(2)只知道類名字符串。(3)通常應(yīng)用到框架中 湿弦。

常用的反射操作 (以Dog這個(gè)類為例子)
package learnReflect;

public class Dog {
    public String name;
    public int age;
    private String owner;
    public  Dog(){
        
    }
    public Dog(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void bark(){
        System.out.println("汪汪");
    }
    public void celebrateBirthday(){
        System.out.println(name+"生日快樂");
        addAge();
    }
    private void addAge(){
        age = age+1;
    }
}

1瓤漏、通過一個(gè)對(duì)象獲得完整的包名和類名

public static void getClassFullName(Dog d){
        System.out.println("1.獲取包名和類名");
        Class c = d.getClass();
        System.out.println("類名: "+c.getName());
        System.out.println("包名: "+c.getPackage().getName());
    }

2、獲得Class對(duì)象 3種方法

public static void getClassInstance(){
        System.out.println("2.獲得類實(shí)例 - 2種方法");
        try {
            String className = "learnReflect.Dog";
            Class c = Class.forName(className);
            System.out.println("method 1:"+c.getName());
            
            Class d = Dog.class;
            System.out.println("method 2:"+c.getName());
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

3、了解類的各種信息

1蔬充、獲取本類的聲明方法,調(diào)用類的方法俯在。

public static void getClassMethod(){
Class<Dog> dogClazz = Dog.class;
Method[] methods = dogClazz.getMethods();//能獲取Dog類所有的public方法,不能獲取private
Method[] methods2 = dogClazz.getDeclaredMethods();//只能獲取Dog類自己定義的所有方法包括私有方法
for(Method m : methods)
System.out.println(m.getName());
try {
//"bark"是方法名娃惯,不存在時(shí)會(huì)拋出異常,new Class[]{}是參數(shù)類型數(shù)組肥败,無參數(shù)就為空
Method method = dogClazz.getMethod("bark", new Class[]{});
//invoke方法用于調(diào)用方法趾浅,參數(shù)為類的實(shí)例和方法的參數(shù)
method.invoke(dogClazz.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}

>2、獲得父類信息
>```
public static void getClassSuperClassInfo(){
        Class<Dog> dogClazz = Dog.class;
        System.out.println("Dog父類的名字是:"+dogClazz.getSuperclass());
    }

3馒稍、獲得接口信息

public static void getClassInterfaceInfo(){
Class<Dog> dogClazz = Dog.class;
for(int i = 0; i< dogClazz.getInterfaces().length;i++)
System.out.println(dogClazz.getInterfaces()[i].getName());
}

    
4皿哨、根據(jù)Class對(duì)象創(chuàng)建instance實(shí)例 

public static void getInstance(){
System.out.println("創(chuàng)建對(duì)象實(shí)例======");
Class<Dog> dogClazz = Dog.class;
try {//方法1:無參的構(gòu)造方法
Object o = dogClazz.newInstance();
System.out.println("創(chuàng)建的對(duì)象是:"+o);
//方法2:有參數(shù)的構(gòu)造方法
Constructor c = dogClazz.getConstructor(new Class[]{String.class,int.class});
Dog o2 = (Dog) c.newInstance("大黃",4);
System.out.println("創(chuàng)建的對(duì)象是:"+o2.name);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

5、操作成員變量

public static void changeFiled(){
System.out.println("改變成員變量======");
Class<Dog> dogClazz = Dog.class;
try {
Object o = dogClazz.newInstance();
//方法2
Constructor c = dogClazz.getConstructor(new Class[]{String.class,int.class});
Dog o2 = (Dog) c.newInstance("大黃",4);
Field[] fields = dogClazz.getFields();
for(Field f : fields){
System.out.println(f.getName());
}
Field[] fields2 = dogClazz.getDeclaredFields();
for(Field f : fields2){
System.out.println(f.getName());
}
Field f = dogClazz.getField("name");
f.set(o2, "大黑");
System.out.println(f.get(o2));
// getDeclaredField()用于獲取私有成員變量纽谒,必須設(shè)置setAccessible(true)才能改變
Field f2 = dogClazz.getDeclaredField("owner");
f2.setAccessible(true);
f2.set(o2, "張三");
System.out.println(f2.get(o2));
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末证膨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鼓黔,更是在濱河造成了極大的恐慌央勒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澳化,死亡現(xiàn)場(chǎng)離奇詭異崔步,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缎谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門井濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人列林,你說我怎么就攤上這事瑞你。” “怎么了希痴?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵者甲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我润梯,道長(zhǎng)过牙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任纺铭,我火速辦了婚禮寇钉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舶赔。我一直安慰自己扫倡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撵溃,像睡著了一般疚鲤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缘挑,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天集歇,我揣著相機(jī)與錄音,去河邊找鬼语淘。 笑死诲宇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惶翻。 我是一名探鬼主播姑蓝,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吕粗!你這毒婦竟也來了纺荧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颅筋,失蹤者是張志新(化名)和其女友劉穎宙暇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體议泵,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡客给,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肢簿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶剑。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖池充,靈堂內(nèi)的尸體忽然破棺而出桩引,到底是詐尸還是另有隱情,我是刑警寧澤收夸,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布坑匠,位于F島的核電站,受9級(jí)特大地震影響卧惜,放射性物質(zhì)發(fā)生泄漏厘灼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一咽瓷、第九天 我趴在偏房一處隱蔽的房頂上張望设凹。 院中可真熱鬧,春花似錦茅姜、人聲如沸闪朱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奋姿。三九已至锄开,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間称诗,已是汗流浹背萍悴。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寓免,地道東北人退腥。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像再榄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子享潜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 學(xué)習(xí)Android的同學(xué)注意了@浮!剑按!學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話疾就,歡迎加入Android學(xué)習(xí)交流群...
    kingZXY2009閱讀 333評(píng)論 0 0
  • 反射機(jī)制的功能 Java反射機(jī)制主要提供了以下功能:在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象...
    Anderson大碼渣閱讀 2,827評(píng)論 1 43
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理艺蝴,服務(wù)發(fā)現(xiàn)猬腰,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Using Java ReflectionBy Glen McCluskey January 1998 Refle...
    轉(zhuǎn)工閱讀 1,189評(píng)論 0 2
  • 待到下次列車駛向重逢 再見的那座城市的天空 依然有笑有夢(mèng) 手機(jī)存留的那些披頭散發(fā)的照片 猶如和煦的微風(fēng)吹漾起的漪 ...
    渡仔喬閱讀 185評(píng)論 0 0