Java 反射機(jī)制

  1. Class與class
    假如把class看做是一張圖紙的話,那根據(jù)圖紙加工出來的零件就是一個(gè)個(gè)的instance(實(shí)例)窍株。那你有沒有想過,實(shí)際上一張具體的圖紙也可以看過是某個(gè)類型的實(shí)例呢攻柠?每張圖紙是不是都有標(biāo)題球订?有作者?有創(chuàng)作日期瑰钮?是不是存在一個(gè)“類”專門來描述它冒滩?答案是,有浪谴,就是Class开睡!
    class是描述對(duì)象的祈搜,Class是用來描述類的。

  2. 獲取Class

MyObject mObj = new MyObject();
Class clazz = mObj.getClass();
Class clazz2 = Class.forName("com.jeremy.reflection.MyObject ");
  1. 使用Class
  • 實(shí)例化對(duì)象
Class clazz = Class.forName("com.jeremy.universal_android.reflection.MyObject");
//通過無參構(gòu)造函數(shù)實(shí)例化對(duì)象
MyObject object = (MyObject) clazz.newInstance();
  • 調(diào)用其他構(gòu)造函數(shù)
public class MyObject {

    final String TAG = "MyObject";

    String name;
    int index;

    public MyObject() {
        this.name = "default";
        this.index = 0;
    }

    public MyObject(String str) {
        this.name = str;
        this.index = 0;
    }

    public MyObject(String str, int i) {
        this.name = str;
        this.index = i;
    }

    public void print() {
        LogTool.e(TAG, "name --> " + name + ",index --> " + index);
    }
  public void printWithParam(String str) {
      LogTool.e(TAG, "printWithParam --> " + str);
  }
}
MyObject object;
Class clazz = Class.forName("com.jeremy.universal_android.reflection.MyObject");
Constructor<?> constructors[] = clazz.getConstructors();
object = (MyObject) constructors[0].newInstance();
object.print();
object = (MyObject) constructors[1].newInstance("My name is Obj");
object.print();
object = (MyObject) constructors[2].newInstance("My name is Obj", 100);
object.print();

結(jié)果為

E/MyObject: name --> default,index --> 0
E/MyObject: name --> My name is Obj,index --> 0
E/MyObject: name --> My name is Obj,index --> 100
  • 獲取實(shí)現(xiàn)的接口
public class MyObject implements Interface1, Interface2 {
}
Class<?> interfaces[] = clazz.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
   LogTool.e(TAG, interfaces[i].getName());
}
E/MyObject: com.jeremy.universal_android.reflection.Interface1
E/MyObject: com.jeremy.universal_android.reflection.Interface2
  • 獲得父類
Class<?> parents = clazz.getSuperclass();
LogTool.e(TAG, parents.getName());

結(jié)果

E/MyObject: java.lang.Object
  • 獲得完整構(gòu)造函數(shù)的簽名
StringBuilder method;
Constructor<?> con;
Constructor<?> cons[] = clazz.getConstructors();
for (int i = 0; i < cons.length; i++) {
    method = new StringBuilder();
    con = cons[i];
//    獲取修飾符
    int modifier = con.getModifiers();
    method.append(Modifier.toString(modifier));
//    獲取構(gòu)造函數(shù)名稱
    method.append(" ").append(con.getName());
    method.append("(");
//    獲取構(gòu)造函數(shù)參數(shù)類型
    Class<?> params[] = con.getParameterTypes();
    for (int j = 0; j < params.length; ++j) {
        method.append(params[j].getName() + " arg" + i);
        if (j < params.length - 1) {
              method.append(",");
        }
    }
    method.append("){}");
    LogTool.e(TAG, method.toString());
}

結(jié)果

 E/MyObject: public com.jeremy.universal_android.reflection.MyObject(){}
 E/MyObject: public com.jeremy.universal_android.reflection.MyObject(java.lang.String arg1){}
 E/MyObject: public com.jeremy.universal_android.reflection.MyObject(java.lang.String arg2,int arg2){}
  • 獲得本類屬性
 Field field = null;
StringBuilder fieldDes = null;
//獲得本類屬性
Field[] fields = clazz.getDeclaredFields();
//獲得父類屬性
//Field[] fields = clazz.getFields();
for (int i = 0; i < fields.length; i++) {
    fieldDes = new StringBuilder();
    field = fields[i];
    //    獲取修飾符
    int modifier = field.getModifiers();
    fieldDes.append(Modifier.toString(modifier));

    Class<?> type = field.getType();
    fieldDes.append(" " + type.getName() + " " + field.getName());
    LogTool.e(TAG, fieldDes.toString());
}

結(jié)果

E/MyObject: public final java.lang.String TAG
E/MyObject: public java.lang.String name
E/MyObject: public int index
  • 通過反射調(diào)用方法
//通過反射調(diào)用方法
Method method1 = clazz.getMethod("print");
method1.invoke(clazz.newInstance());
//調(diào)用有參數(shù)的方法
method1 = clazz.getMethod("printWithParam", String.class);
method1.invoke(clazz.newInstance(), "hello world");

結(jié)果

E/MyObject: name --> default,index --> 0
E/MyObject: printWithParam --> hello world
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末士八,一起剝皮案震驚了整個(gè)濱河市容燕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婚度,老刑警劉巖蘸秘,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝗茁,居然都是意外死亡醋虏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門哮翘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颈嚼,“玉大人,你說我怎么就攤上這事饭寺∽杩危” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵艰匙,是天一觀的道長(zhǎng)限煞。 經(jīng)常有香客問我,道長(zhǎng)员凝,這世上最難降的妖魔是什么署驻? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮健霹,結(jié)果婚禮上旺上,老公的妹妹穿的比我還像新娘。我一直安慰自己糖埋,他們只是感情好宣吱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阶捆,像睡著了一般凌节。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洒试,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天倍奢,我揣著相機(jī)與錄音,去河邊找鬼垒棋。 笑死卒煞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叼架。 我是一名探鬼主播畔裕,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衣撬,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了扮饶?” 一聲冷哼從身側(cè)響起具练,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甜无,沒想到半個(gè)月后扛点,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岂丘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年陵究,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奥帘。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铜邮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寨蹋,到底是詐尸還是另有隱情松蒜,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布钥庇,位于F島的核電站牍鞠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏评姨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一萤晴、第九天 我趴在偏房一處隱蔽的房頂上張望吐句。 院中可真熱鬧,春花似錦店读、人聲如沸嗦枢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽文虏。三九已至,卻和暖如春殖演,著一層夾襖步出監(jiān)牢的瞬間氧秘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工趴久, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丸相,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓彼棍,卻偏偏與公主長(zhǎng)得像灭忠,于是被迫代替她去往敵國(guó)和親膳算。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 1.反射機(jī)制是什么: 反射機(jī)制是在運(yùn)行狀態(tài)中弛作,對(duì)于任意一個(gè)類涕蜂,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象映琳,...
    蠻大人我們走閱讀 347評(píng)論 0 0
  • 詳解Java反射機(jī)制(Reflection) 反射機(jī)制的作用 JAVA反射機(jī)制是在運(yùn)行狀態(tài)中机隙,對(duì)于任意一個(gè)類,都能...
    顏洛濱閱讀 1,020評(píng)論 0 2
  • 基本概念 java的反射機(jī)制是動(dòng)態(tài)獲取類的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法刊头。這種機(jī)制允許程序在運(yùn)行時(shí)通過reflecti...
    YONGSSU的技術(shù)站點(diǎn)閱讀 778評(píng)論 0 10
  • [toc] 反射機(jī)制: 允許程序在運(yùn)行時(shí)取得任何一個(gè)已知名稱的class的內(nèi)部信息黍瞧,容許程序在運(yùn)行時(shí)加載、探知原杂、使...
    卡路fly閱讀 2,569評(píng)論 2 14
  • 繼續(xù)美食篇印颤,我們幾位新結(jié)識(shí)的朋友,相約一天穿肄,去這真正體驗(yàn) 一把當(dāng)?shù)孛癖娚钅昃帧=Y(jié)果帶著我們的好奇感,我們從酒店約好了...
    達(dá)達(dá)媽閱讀 378評(píng)論 0 0