大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 為什么用Java反射機制

為什么用Java反射機制

更新時間:2020-11-23 17:56:41 來源:動力節點 瀏覽1418次

在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。通俗的講就是反射可以在運行時根據指定的類名獲得類的信息。那么我們為什么用反射機制呢?


首先我們先明確兩個概念,靜態編譯和動態編譯。

靜態編譯:在編譯時確定類型,綁定對象,即通過。

動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,有以降低類之間的藕合性。   

 

我們可以明確的看出動態編譯的好處,而反射就是運用了動態編譯創建對象。那么我們再來看看實際中反射又有什么好處那?

往往對比能更加直觀的向我們展示兩者的不同。

先從某個代碼案例上來解釋:

若是不用反射,它是這樣的

 

interface fruit{  

    public abstract void eat();  

}  

    

class Apple implements fruit{  

    public void eat(){  

        System.out.println("Apple");  

    }  

}  

    

class Orange implements fruit{  

    public void eat(){  

        System.out.println("Orange");  

    }  

}  

    

// 構造工廠類  

// 也就是說以后如果我們在添加其他的實例的時候只需要修改工廠類就行了  

class Factory{  

    public static fruit getInstance(String fruitName){  

        fruit f=null;  

        if("Apple".equals(fruitName)){  

            f=new Apple();  

        }  

        if("Orange".equals(fruitName)){  

            f=new Orange();  

        }  

        return f;  

    }  

}  

class hello{  

    public static void main(String[] a){  

        fruit f=Factory.getInstance("Orange");  

        f.eat();  

    }  

    

}  


可以發現,每當我們要添加一種新的水果的時候,我們將不得不改變Factory中的源碼,而往往改變原有正確代碼是一種風險很高的行為。而且隨著水果種類的增加,你會發現你的factory類代碼會越來越臃腫,不得不說這是一種性價比很低的做法。(初學者可能會問,我們為什么不直接在main方法中new水果那,我們可能會需要getInstance方法做一些別的事情。。。所以不直接new);而反射無疑是一種聰明的辦法,看代碼。

interface fruit{  

    public abstract void eat();  

}  

   

class Apple implements fruit{  

    public void eat(){  

        System.out.println("Apple");  

    }  

}  

   

class Orange implements fruit{  

    public void eat(){  

        System.out.println("Orange");  

    }  

}  

   

class Factory{  

    public static fruit getInstance(String ClassName){  

        fruit f=null;  

        try{  

            f=(fruit)Class.forName(ClassName).newInstance();  

        }catch (Exception e) {  

            e.printStackTrace();  

        }  

        return f;  

    }  

}  

class hello{  

    public static void main(String[] a){  

        fruit f=Factory.getInstance("Reflect.Apple");  

        if(f!=null){  

            f.eat();  

        }  

    }  

}  

在出現新品種水果的時候,你完全不用去修改原有代碼。


從上面的案例中,我們可以清楚的體會到反射的優越性。

那么有的人又會問,這個例子能完全明白,但是如果放到實際的編程,應用中,我們又會在什么情況下用到反射那?


 舉一個看到過的例子,在實際開發中,我們需要把一個包中的class new出來,但是這個包中的類總是需要變動,那么怎么辦,難道總是修改main方法中xxx=new xxx()嗎。這樣無疑是麻煩的。而運用反射。我們可以相應的增加一個配置文件,在里面記錄包中所有的類名,包中類增加時就加一個類名,刪除時就刪除一個類名。讓main方法去讀取這個配置文件中的類名,通過反射獲得實例,完全不用我們去修改main方法中的代碼。

 

除此之外,Java反射甚至可以修改其他類中的私有屬性。在Android開發中,我們需要改變一個私有標志位的時候,Android源碼并沒有提供set方法,我們又不能改變源碼,這個時候反射也可以完美地解決這個問題。

 

經過以上的介紹對于為什么用java反射機制,有了或多或少的認識,但事實上在我們的開發中,不全部都用反射機制?原因就是用java反制機制開銷很大,費用十分昂貴,所以我們盡量在最需要的地方合理地使用反射。在本站的Java基礎教程中,對Java反射進行了十分全面的講解,想要徹底弄懂Java反射的小伙伴一定不要錯過。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲精品国产成人7777 | 亚洲一区二区三区免费视频 | 青青青青久在线观看视频 | 一级片在线观看免费 | 国产自愉自愉全免费高清 | 影音先锋在线亚洲精品推荐 | 色视频一区 | 色婷婷综合在线视频最新 | 久久在线看| 亚洲一区二区三区久久 | 免费一级毛片清高播放 | 亚洲射图| 精品国产_亚洲人成在线高清 | 国产精品久久久久久久午夜片 | 日本免费一区二区三区毛片 | 国产牛牛 | 日韩毛片免费 | 国产精品国内免费一区二区三区 | 纯欧美一级毛片免费 | 伊人久久久综在合线久久在播 | 伊人久久大杳蕉综合大象 | 久久影院精品 | 日韩欧美视频在线播放 | 免费一级毛片麻豆精品 | 久久国产精品最新一区 | 中文字幕一区二区三区亚洲精品 | 欧美特黄一级大黄录像 | 久久久婷婷亚洲5月97色 | 神马影院在线观看我不卡 | 99久久综合狠狠综合久久一区 | 99香蕉国产精品偷在线观看 | 五月天天爱| 国产精品久久自在自线观看 | 九九免费精品视频在这里 | 福利视频专区 | 久久亚洲精品视频 | 四虎影视成人永久在线观看 | 日日操日日舔 | 欧美视频在线观看一区二区 | 久久久美女视频 | 亚洲人成伊人成综合网久久久 |