Java高級特性---反射

image.png
定義:
JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性拔莱;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機制碗降。
用途:
日常使用的三方開源框架,經(jīng)常會遇到碰到成員變量塘秦、方法或是屬性是私有的或是只對系統(tǒng)應(yīng)用開放讼渊,這時利用java反射機制獲取所需的私有成員或是方法。
反射相關(guān)的類:
與java反射相關(guān)的類:
類名 用途
Method 代表方法的類
Class 代表類的實體
Field 代表類中的成員屬性(類屬性)
Constructor 代表類的構(gòu)造方法
1尊剔、Class類
反射始于Class爪幻,Class是一個類,封裝了當(dāng)前對象所對應(yīng)的類的信息须误。一個類中有屬性挨稿,方法,構(gòu)造器等
獲取Class對象的三種方式:
(1). 通過類名獲取 類名.class
 Class<? extends UIUtils> uiUtils =UIUtils.class;
(2). 對象名.getClass()
  Class<? extends Activity> activityClass = activity.getClass();
(3).通過全類名獲取 Class.forName(全類名) classLoader.loadClass(全類名)
    try {
         Class mActivity=Class.forName("com.potato.refled.MainActivity");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
判斷是否為某個類的實例:
在工作中一般我們使用"instanceof"關(guān)鍵字來判斷時候是某個類的實例霹期,在反射中一般通常借用isInstance()叶组,方法來判斷是否為某個類的實例拯田,它是一個 native 方法
  public native boolean isInstance(Object obj);
判斷是否為某個類的類型
  public boolean isAssignableFrom(Class<?> cls)
創(chuàng)建類的實例:
 Class<? extends UIUtils> uiUtils =UIUtils.class;
     try {
           Object utils =uiUtils.newInstance();
         } catch (Exception e) {
            e.printStackTrace();
        }
2历造、Method類
Method getMethod(String name, Class[] params) -- 使用特定的參數(shù)類型,獲得命名的公共方法
Method[] getMethods() -- 獲得類的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數(shù)類型船庇,獲得類聲明的命名的方法
Method[] getDeclaredMethods() -- 獲得類聲明的所有方法.
當(dāng)獲取到的方法之后吭产,采用invoke()來調(diào)用這個方法。
  //object 當(dāng)前獲取到的方法實例類對象鸭轮,args 調(diào)用該方法需要傳入的參數(shù)臣淤。
  public Object invoke(Object obj, Object... args)
3、Field類
getField(String name) 根據(jù)屬性名獲得某個公有的屬性對象
getFields() 獲取某個實例對象中的全部公有屬性對象
getDeclaredField(String name) 根據(jù)屬性名獲得某個私有的屬性對象
getDeclaredFields() 獲取某個實例對象中的全部私有屬性對象
4窃爷、Constructor類
getConstructor(Class...<?> parameterTypes) 獲得該類中與參數(shù)類型匹配的公有構(gòu)造方法
getConstructors() 獲得該類的所有公有構(gòu)造方法
getDeclaredConstructor(Class...<?> parameterTypes) 獲得該類中與參數(shù)類型匹配的構(gòu)造方法
getDeclaredConstructors() 獲得該類所有構(gòu)造方法。
示例:
為了演示反射的使用医吊,首先構(gòu)造一個與書籍相關(guān)的model——Book.java,然后通過反射方法示例創(chuàng)建對象、反射私有構(gòu)造方法穗慕、反射私有屬性揍诽、反射私有方法:
  
public class Book {

    private String name;
    private String author;

    public String getName() {
        return name;
    }

    private Book(String name, String author) {
        this.name = name;
        this.author = author;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    private void printOject(){
        toString();
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                '}';
    }

}

反射創(chuàng)建對象
//反射創(chuàng)建對象
private static void newInstance(){
        try {
           Class mBook = Class.forName("com.potato.lib.Book");
            Object mObject =mBook.newInstance();
            Book book = (Book) mObject;
            book.setAuthor("xiaoming");
            book.setName("xxx");
            System.out.println(book.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
image.png
反射私有屬性添吗、反射私有方法
//反射私有屬性妓美、反射私有方法
private static void  flectAttribute(){
        try {
            Class mBookClass = Class.forName("com.potato.lib.Book");
            Object object = mBookClass.newInstance();
            Method setAuthor= mBookClass.getMethod("setAuthor", String.class);
            Method setName = mBookClass.getMethod("setName", String.class);
            setAuthor.invoke(object,"xiaoming");
            setName.invoke(object,"xxx");
            //反射私有方法
            Method printOject =mBookClass.getDeclaredMethod("printOject");
            printOject.setAccessible(true);
            printOject.invoke(object);

            Field nameField = mBookClass.getDeclaredField("name");
            nameField.setAccessible(true);
            nameField.set(object,"xoxoxo");
            printOject.invoke(object);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
反射私有構(gòu)造方法
public static void reflectPrivateConstructor() {
        try {
            Class<?> classBook = Class.forName("ccom.potato.lib.Book");
            Constructor<?> declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);
            declaredConstructorBook.setAccessible(true);
            Object objectBook = declaredConstructorBook.newInstance("xiaoming","666");
            Book book = (Book) objectBook;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

總結(jié):

本文列舉了反射機制使用過程中常用的贵试、重要的一些類及其方法 以通過反射獲得Method對象為例毙玻,一般會提供四種方法,getMethod(parameterTypes)运准、getMethods()、getDeclaredMethod(parameterTypes)和getDeclaredMethods()听哭。getMethod(parameterTypes)帶有Declared修飾的方法可以反射到私有的方法,沒有Declared修飾的只能用來反射公有的方法隘马。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嬉挡,更是在濱河造成了極大的恐慌,老刑警劉巖基括,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揪阶,死亡現(xiàn)場離奇詭異炊苫,居然都是意外死亡执虹,警方通過查閱死者的電腦和手機袋励,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蚁鳖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徙垫,“玉大人,你說我怎么就攤上這事逗抑『ィ” “怎么了邮府?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溉奕。 經(jīng)常有香客問我褂傀,道長,這世上最難降的妖魔是什么加勤? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任仙辟,我火速辦了婚禮,結(jié)果婚禮上鳄梅,老公的妹妹穿的比我還像新娘叠国。我一直安慰自己,他們只是感情好戴尸,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布粟焊。 她就那樣靜靜地躺著,像睡著了一般孙蒙。 火紅的嫁衣襯著肌膚如雪项棠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天挎峦,我揣著相機與錄音香追,去河邊找鬼。 笑死坦胶,一個胖子當(dāng)著我的面吹牛透典,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顿苇,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼峭咒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了岖圈?” 一聲冷哼從身側(cè)響起讹语,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜂科,沒想到半個月后顽决,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體短条,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年才菠,在試婚紗的時候發(fā)現(xiàn)自己被綠了茸时。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡赋访,死狀恐怖可都,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚓耽,我是刑警寧澤渠牲,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站步悠,受9級特大地震影響签杈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鼎兽,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一答姥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谚咬,春花似錦鹦付、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至互捌,卻和暖如春潘明,著一層夾襖步出監(jiān)牢的瞬間行剂,已是汗流浹背秕噪。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厚宰,地道東北人腌巾。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像铲觉,于是被迫代替她去往敵國和親澈蝙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359