反射

創(chuàng)建反射對象

// 第一種創(chuàng)建方法
User user = new User;
Class c = user.getClass();
// 第二種創(chuàng)建方法
Class c2 = User.getClass();
// 第三種創(chuàng)建方法(推薦)
Class c3 = Class.forName("com.kgc.j341.keshang001.User");

// 通過反射調用無參構造創(chuàng)建字節(jié)碼類User的對象
// Java 9之后被廢棄
User user = (User) c3.newInstance();
// 可用此方法代替
User user = (User) c1.getDeclaredConstructor().newInstance();


public class User {
    private String name;
    private int age;
    private String sex;
    public User() {
    }
    private User(String name) {
        this.name = name;
    }
    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    private void show() {
        System.out.println("User [name=" + name + "\t, age=" + age+ "\t, sex=" + sex + "\t]");
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", sex=" +sex + "]";
    }
}
  • Constructor: 構造方法
  • Method:普通方法
  • Field:屬性

調用字節(jié)碼類中的構造方法

// 獲取字節(jié)碼對象
Class clazz = Class.forName("cn.kgc.j341.keshang023.User");
// 調用有參構造實例化對象
User user = (User) clazz.getConstructor(String.class, 
            int.class, String.class).newInstance("張三", 18, "男");
System.out.println(user);
// 調用私有的構造方法實例化對象
Constructor constructor =clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
System.out.println(constructor.newInstance("李四"));

調用一般方法

// 獲取class文件對應的字節(jié)碼對象(Class對象)
Class c1 = Class.forName("cn.kgc.j341.keshang023.User");
// 通過反射機制調用無參構造創(chuàng)建對象
User user = (User) c1.getDeclaredConstructor().newInstance();
System.out.println(user.toString());
// 獲取反射對象類中的toString方法
Method m1 = c1.getDeclaredMethod("toString");
// 通過invoke()操作一般方法
System.out.println(m1.invoke(user));
Method m2 = c1.getDeclaredMethod("show");
// 如果方法是私有方法需要使用setAccessible()方法開啟私有開關才能進行操作
    m2.setAccessible(true);
// 通過invoke()操作一般方法
    m2.invoke(user);
System.out.println("***********************************");
// 操作有參方法                               參數(shù)類型
Method m3 = c1.getDeclaredMethod("setName", String.class);
            m3.invoke(user, "張三");
       m3 = c1.getDeclaredMethod("setAge", int.class);
            m3.invoke(user, 18);
       m3 = c1.getDeclaredMethod("setSex", String.class);
            m3.invoke(user, "男");
System.out.println(m1.invoke(user));

獲取屬性

Class clazz = Class.forName("cn.kgc.j341.keshang023.User");
User user = (User) clazz.getDeclaredConstructor().newInstance();
// 獲取屬性
Field field = clazz.getDeclaredField("age");
// 打開私有化
field.setAccessible(true);
// 為屬性賦值
field.set(user, 18);
System.out.println(user);

方法

  • getDeclaredConstructor():獲取反射對象的構造方法
  • getConstructor():獲取非私有化的反射對象的構造方法
  • newInstance():實例化對象
  • getDeclaredField():獲取屬性
  • getField():獲取非私有化的屬性
  • getDeclaredMethod():獲取一般方法
  • getMethod():獲取非私有化的方法
  • set():設置獲取的屬性值
  • setAccessible():打開私有開關
  • invoke():調用方法
?著作權歸作者所有,轉載或內容合作請聯(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
  • 正文 為了忘掉前任限番,我火速辦了婚禮扼褪,結果婚禮上言秸,老公的妹妹穿的比我還像新娘。我一直安慰自己迎捺,他們只是感情好举畸,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凳枝,像睡著了一般抄沮。 火紅的嫁衣襯著肌膚如雪跋核。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天叛买,我揣著相機與錄音砂代,去河邊找鬼。 笑死率挣,一個胖子當著我的面吹牛刻伊,可吹牛的內容都是我干的。 我是一名探鬼主播椒功,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼捶箱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了动漾?” 一聲冷哼從身側響起丁屎,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旱眯,沒想到半個月后晨川,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡删豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年共虑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀页。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡看蚜,死狀恐怖,靈堂內的尸體忽然破棺而出赔桌,到底是詐尸還是另有隱情供炎,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布疾党,位于F島的核電站音诫,受9級特大地震影響,放射性物質發(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

推薦閱讀更多精彩內容

  • (轉自csdn) 反射是框架設計的靈魂 (使用的前提條件:必須先得到代表的字節(jié)碼的Class,Class類用于表示...
    尼爾君閱讀 228評論 0 1
  • 課程地址:Java基礎之 — 反射(非常重要) (使用的前提條件:必須先得到代表的字節(jié)碼的Class袍辞,Cla...
    叨唧唧的閱讀 688評論 0 2
  • 不論是 Java 開發(fā) 還是 Android 開發(fā),反射常摧、泛型搅吁、注解 都是架構設計中很重要的一個知識點。 為了更好...
    JamFF閱讀 538評論 0 4
  • 什么是java反射: JAVA反射機制是在運行狀態(tài)中落午,對于任意一個類谎懦,都能夠知道這個類的所有屬性和方法;對于任意一...
    樂百事52淑熙閱讀 338評論 0 0
  • 孤獨我害怕 卻又不得不已他為生 我害怕人 卻又渴望真城 真誠何在 我已何在
    thelegend_0e66閱讀 147評論 0 1