具體的關於反射的介紹能夠參考個人另一篇博文《深刻解析java反射》。html
反射的意義是什麼,其實就是爲了代碼簡潔,提升代碼的複用率,外部調用方便,源代碼,反編譯都能看到。java
某些狀況下解耦用反射要清晰不少,下面是簡單的測試安全
1 package cn.yonyong.reflection.testdemo; 2 3 interface Fruit { //水果接口 4 public void eat() ; //吃水果 5 } 6 7 class Apple implements Fruit{ //定義蘋果 8 public void eat() { 9 System.out.println("**吃蘋果。"); 10 } 11 } 12 13 class Orange implements Fruit{ 14 public void eat() { 15 System.out.println("**吃橘子。"); 16 } 17 } 18 19 class Factory{ 20 public static Fruit getInstance(String className){ 21 Fruit fruit = null ; 22 try{ 23 fruit = (Fruit) Class.forName(className).newInstance() ; 24 }catch(Exception e ){ 25 e.printStackTrace() ; 26 } 27 return fruit ; 28 } 29 } 30 31 public class FactoryDemo{ 32 public static void main(String args[]){ 33 //經過工廠類取得接口實例,傳入完整的包.類名稱 34 Fruit f = Factory.getInstance("cn.yonyong.reflection.testdemo.Apple") ; 35 if(f!=null){ //判斷是否取得接口實例 36 f.eat() ; 37 } 38 } 39 }
輸出:
**吃蘋果。測試
若是不用反射,那麼咱們若是再加一個西瓜類,就得在Factory裏判斷,每添加一個類都要修改一次Factory,但用了反射只用在調用的時候傳入完整的類名就可完成。結果:用反射,修改一處代碼;不用反射,修改兩處代碼。ui
可是,咱們知道java面向對象主要有四大特性:spa
封裝、抽象、繼承和多態。
封裝:在面嚮對象語言中,封裝特性是由類來體現的,咱們將現實生活中的一類實體定義成類,其中包括屬性和行爲(在Java中就是方法),就好像人類,能夠具備name,sex,age等屬性,同時也具備eat(),sleep()等行爲,咱們在行爲中實現必定的功能,也可操做屬性,這是面向對象的封裝特性;
抽象:抽象就是將一類實體的共同特性抽象出來,封裝在一個抽象類中,因此抽象在面嚮對象語言是由抽象類來體現的。好比鳥就是一個抽象實體,由於抽象實體並非一個真正的對象,它的屬性還不能徹底描述一個對象,因此在語言中體現爲抽象類不能實例化;
繼承:繼承就像是咱們現實生活中的父子關係,兒子能夠遺傳父親的一些特性,在面嚮對象語言中,就是一個類能夠繼承另外一個類的一些特性,從而能夠代碼重用,其實繼承體現的是is-a關係,父類同子類在本質上仍是一類實體;
多態:多態就是經過傳遞給父類對象引用不一樣的子類對象從而表現出不一樣的行爲 ...
code
那麼既然Java反射能夠訪問和修改私有成員變量,那封裝成private還有意義麼?htm
既然小偷能夠訪問和搬走私有成員傢俱,那封裝成防盜門還有意義麼?這是同樣的道理,而且Java從應用層給咱們提供了安全管理機制——安全管理器,每一個Java應用均可以擁有本身的安全管理器,它會在運行階段檢查須要保護的資源的訪問權限及其它規定的操做權限,保護系統免受惡意操做攻擊,以達到系統的安全策略。因此其實反射在使用時,內部有安全控制,若是安全設置禁止了這些,那麼反射機制就沒法訪問私有成員。對象