Java反射實例

反射可以解決在編譯時無法預知對象和類是屬于那個類的蠢棱,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題锌杀。在兩個人協(xié)作開發(fā)時,你只要知道對方的類名就可以進行初步的開發(fā)了泻仙。
JAVA反射機制是在運行狀態(tài)中糕再,對于任意一個類,都能夠知道這個類的所有屬性和方法饰豺;對于任意一個對象亿鲜,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制冤吨。

public class Man implements AnimalBaseSkill{
    public static String AGE=12;
    public int sex=-1;    
    private String name;    
    private Man(int sex, String name) {      
        this.sex = sex;        
        this.name = name;    
    }    
    public Man() {         
    }    
    public int getSex() {        
        return sex;    
    }    
    public void setSex(int sex) {        
        this.sex = sex;    
    }    
    public String getName() {        
        return name;    
    }    
    public void setName(String name) {        
        this.name = name;    
    }
    @Override
    public void eat() {}
    private class Clan {    
        String clanName="default family";    
        public Clan(String familyName) {        
            this.clanName = familyName;    
        }    
        public Clan() {    
        }    
        public String getClanName() {        
            return clanName;    
        }    
        public void setClanName(String clanName) {        
            this.clanName = clanName;    
        }
    }
}

一 :獲取類的三種方法

Class.forName(String clazzName)靜態(tài)方法
調(diào)用類的class屬性蒿柳,Person.class返回的就是Person的class對象(推薦使用)
調(diào)用某個對象的getClass()方法

Class class_Man = Class.forName("com.ch.java.reflect.Man");
Class class_Man = Man.class;
Class class_Man =Man.getClass();

二 :獲取私有內(nèi)部類

但是只有方法一可以獲取私有內(nèi)部類:
Class class_Clan=Class.forName("com.ch.java.reflect.Man$Clan");

三 :獲取構(gòu)造器和自己的實例

獲取Class后,然后通過Class獲取構(gòu)造器漩蟆,通過newInstance()就可以獲取該對象:
Constructor constructor=class_Man.getConstructor(null); 
Man man= (Man) constructor.newInstance();

四 :獲取內(nèi)部類對象

但是內(nèi)部類的對象要像下面獲取垒探,原因會在(如何獲取類構(gòu)造器?)講解
Constructor constructor=class_Clan.getConstructor(Man.class, String.class);  //如果Clan構(gòu)造函數(shù)沒有可以不傳
Object family=constructor.newInstance(man, "123");

五 :獲取類構(gòu)造器

getConstructor(Class...parameterTypes):返回此Class對象對應類的帶指定形參的public構(gòu)造器,返回參數(shù):Connstructor
getConstructors():返回此Class對象對應類的所有public構(gòu)造器怠李,返回參數(shù):Constructor[]
getDeclaredConstructor(Class...parameterTypes):返回此class對象對應類的帶指定參數(shù)的構(gòu)造器圾叼,與構(gòu)造器的訪問權限無關,返回參數(shù):Constructor[]
getDeclaredConstructors():返回此class對象對應類的所有構(gòu)造器捺癞,與構(gòu)造器的訪問權限無關夷蚊,返回參數(shù):Constructor[]

六 :獲取類成員方法

getMethod(String name,Class<?>...parameterTypes):返回此class對象對應類的帶指定形參的public方法,返回參數(shù):Method
Method[] getMethods():返回此class對象所表示的類的所有public方法
Method getDeclaredMethod(string name,Class<?>...parameterTypes):返回此class對象對應類的帶指定形參的方法,與方法訪問權限無關
Method[] getDeclaredMethods():返回此class對象對應類的全部方法髓介,與方法的訪問權限無關

七 :獲取成員變量獲取屬性

Field getField(String name):返回此class對象對應類的指定名稱的public成員變量
getFields():返回此class對象對應類的所有public成員變量惕鼓,返回參數(shù):Field[]
getDeclaredField(String name):返回此class對象對應類的指定名稱的成員變量,與成員變量訪問權限無關唐础。返回參數(shù):Field
getDeclaredFields():返回此class對象對應類的全部成員變量箱歧,與成員變量的訪問權限無關,返回參數(shù):Field[]
Object property = class_Man.get(AGE) :此如果屬性石靜態(tài)的一膨,可直接從class對象中取出呀邢。

八:執(zhí)行方法某對象的方法

public Object invokeMethod(Object owner, String methodName, Object[] args) 
執(zhí)行該方法的方法 method.invoke(owner, args)

method.invoke(owner, args):執(zhí)行該Method.invoke方法的參數(shù)是執(zhí)行這個方法的對象owner,和參數(shù)數(shù)組args豹绪,可以這么理解:owner對象中帶有參數(shù)args的method方法价淌。返回值是Object,也既是該方法的返回值。

Method中invoke(Object obj,Object...args)第一個參數(shù)為類的實例输钩,
 第二個參數(shù)為相應函數(shù)中的參數(shù).
* provoked by this method fails.
*/
public native Object invoke(Object receiver, Object... args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;
/**
public void setHobby(String[] hobby) {
    this.hobby = hobby;
}

用Invoke調(diào)用函數(shù)
  Class clazz = SimpleBean.class;
//使用無參構(gòu)造函數(shù)實例化bean
 SimpleBean sb = (SimpleBean)clazz.newInstance();
//列出類SimpleBean的所有方法
 Method[] methods = clazz.getDeclaredMethods(); System.out.println("get methods of class SimpleBean:");
 for(Method method : methods) {
    if("setHobby".equals(method.getName())) {
    //動態(tài)調(diào)用類的方法來為hobby設置值
    method.invoke(sb, new Object[]{new String[]{"tennis","fishing"}});
}

八:Filed的get和set方法

get(Object obj) 返回指定(ListenerInfo)對象上此 Field (OnClickListener ) 表示的字段的值豺型。

static class ListenerInfo{
        public OnClickListener mOnClickListener;
}
 Class listenerInfoClazz = Class.forName("com.View$ListenerInfo");
/*得到View$ListenerInfo類中mOnClickListener屬性*/
 Field mOnClickListenerField = listenerInfoClazz.getDeclaredField("mOnClickListener");
//得到Infor中mOnClickListener
OnClickListener mOnClickListener = (OnClickListener) mOnClickListenerField.get(listenerInfoObj);

void set(Object obj, Object value) 將指定對象(ListenerInfo)變量上此 Field (OnClickListener )字段設置為指定的新值仲智。

OnClickListener mOnClickListener = (OnClickListener) mOnClickListenerField.get(listenerInfoObj);
/*使用自定義代理方法*/
System.err.println("mOnClickListener   :"+mOnClickListener);
OnClickListener mOnClickListenerProxy=new OnClickListenerProxy(mOnClickListener);
System.out.println("mOnClickListenerProxy    :"+mOnClickListenerProxy);
//更換
mOnClickListenerField.set(listenerInfoObj, mOnClickListenerProxy);
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末买乃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钓辆,更是在濱河造成了極大的恐慌剪验,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前联,死亡現(xiàn)場離奇詭異功戚,居然都是意外死亡,警方通過查閱死者的電腦和手機似嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門啸臀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烁落,你說我怎么就攤上這事乘粒。” “怎么了伤塌?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵灯萍,是天一觀的道長。 經(jīng)常有香客問我每聪,道長旦棉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任药薯,我火速辦了婚禮绑洛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童本。我一直安慰自己真屯,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宪潮,像睡著了一般戳表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晾匠,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音梯刚,去河邊找鬼凉馆。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的澜共。 我是一名探鬼主播向叉,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗦董!你這毒婦竟也來了母谎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤京革,失蹤者是張志新(化名)和其女友劉穎奇唤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匹摇,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡咬扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了廊勃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懈贺。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坡垫,靈堂內(nèi)的尸體忽然破棺而出梭灿,到底是詐尸還是另有隱情,我是刑警寧澤葛虐,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布胎源,位于F島的核電站,受9級特大地震影響屿脐,放射性物質(zhì)發(fā)生泄漏涕蚤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一的诵、第九天 我趴在偏房一處隱蔽的房頂上張望万栅。 院中可真熱鬧,春花似錦西疤、人聲如沸烦粒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扰她。三九已至,卻和暖如春芭碍,著一層夾襖步出監(jiān)牢的瞬間徒役,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工窖壕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忧勿,地道東北人杉女。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像鸳吸,于是被迫代替她去往敵國和親熏挎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晌砾,服務發(fā)現(xiàn)坎拐,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法贡羔,類相關的語法廉白,內(nèi)部類的語法,繼承相關的語法乖寒,異常的語法,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉院溺,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評論 0 9
  • (一)Java部分 1楣嘁、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,111評論 0 62
  • 深圳的氣溫再創(chuàng)新高逐虚,電壓變得不穩(wěn)定,燈光忽明忽暗的像是在拍鬼片谆膳,還好能一直堅挺的沒有跳閘斷電叭爱。 好吧,就在我敲完這...
    新生的新生活閱讀 260評論 0 0