計(jì)算機(jī)基礎(chǔ)知識(shí)分享-4(IOC,DI,java反射機(jī)制)

IOC控制反轉(zhuǎn)(Inversion of Control)

我們傳統(tǒng)的javaSE程序等都基本是一種典型的相互依賴的程序,也就是一些相互協(xié)作的對(duì)象構(gòu)成的。也就是我們所說的正轉(zhuǎn),即是通過硬編程new一些對(duì)象然后對(duì)象間相互依賴。所謂的的控制反轉(zhuǎn)就是把創(chuàng)建和查找對(duì)象交給容器。

  1. 目的:IOC是一種編程思想,建立一個(gè)松散耦合的程序。(高內(nèi)聚,低耦合的思想)

  2. 把對(duì)對(duì)象的控制權(quán)交給IOC容器控制對(duì)象的生命周期和對(duì)象間的關(guān)系

  3. 通過例子理解:

    • 原始社會(huì)中,比如我們需要斧子,就得自己設(shè)計(jì)斧子,打造斧子,最后才能用這把自己做的斧子。這就有點(diǎn)類似JAVA中自己創(chuàng)建一個(gè)對(duì)象,然后通過new的方式創(chuàng)建一個(gè)對(duì)象調(diào)用對(duì)象的方法。
    • 在工業(yè)社會(huì)中,比如我們需要斧子,就的去商店購(gòu)買一把斧子,而這把斧子就從工廠中生產(chǎn)出來的。這個(gè)時(shí)候就像是JAVA中工廠模式,需要某些對(duì)象時(shí)候就通過簡(jiǎn)單的工廠模式設(shè)計(jì),我們只要調(diào)用工廠類就可以得到想要的對(duì)象。
    • 在牛逼的共產(chǎn)主義社會(huì)中,我們就只要坐等斧子的到來,全自動(dòng)的給我們斧子對(duì)象,等待IOC容器的注入對(duì)象。(無需理會(huì)斧子要怎么new一個(gè)對(duì)象,無需定位工廠類)

DI依賴注入(Dependency Injection)

其實(shí)IOC依賴注入和DI控制反轉(zhuǎn)是統(tǒng)一的,在一個(gè)運(yùn)行的IOC容器中,容器能夠動(dòng)態(tài)的提供給一些需要的其他對(duì)象或者說組件中。這些需要的對(duì)象就是通過DI這個(gè)方式注入來實(shí)現(xiàn)的。至于怎么實(shí)現(xiàn),就是通過JAVA的反射機(jī)制來實(shí)現(xiàn)的。

  1. 注入的方式:
    1. setter設(shè)值注入
    2. 構(gòu)造注入
  2. java的反射機(jī)制
    1. 概念:在java運(yùn)行的過程中,對(duì)于任意的類都可以知道他的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象都可以調(diào)用他的屬性和方法,這種動(dòng)態(tài)獲取對(duì)象和調(diào)用對(duì)象方法的功能。
    2. 反射機(jī)制獲取類有三種方法:
    //第一種方式:  
    Classc1 = Class.forName("Employee");  
    //第二種方式:  
    //java中每個(gè)類型都有class 屬性.  
    Classc2 = Employee.class;  
     
    //第三種方式:  
    //java語(yǔ)言中任何一個(gè)java對(duì)象都有g(shù)etClass 方法  
    Employeee = new Employee();  
    Classc3 = e.getClass(); //c3是運(yùn)行時(shí)類 (e的運(yùn)行時(shí)類是Employee)  
    
    1. 創(chuàng)建對(duì)象:獲取類以后我們來創(chuàng)建它的對(duì)象,利用newInstance
    Class c =Class.forName("Employee");  
    //創(chuàng)建此Class 對(duì)象所表示的類的一個(gè)新實(shí)例  
    Objecto = c.newInstance(); //調(diào)用了Employee的無參數(shù)構(gòu)造方法. 
    
    1. 獲取屬性:分為所有的屬性和指定的屬性:
     ```
     /獲取整個(gè)類  
         Class c = Class.forName("java.lang.Integer");  
           //獲取所有的屬性?  
         Field[] fs = c.getDeclaredFields();  
    
                //定義可變長(zhǎng)的字符串,用來存儲(chǔ)屬性  
         StringBuffer sb = new StringBuffer();  
         //通過追加的方法,將每個(gè)屬性拼接到此字符串中  
         //最外邊的public定義  
         sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
         //里邊的每一個(gè)屬性  
         for(Field field:fs){  
             sb.append("\t");//空格  
             sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等  
             sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字  
             sb.append(field.getName()+";\n");//屬性的名字+回車  
         }  
    
         sb.append("}");  
    
         System.out.println(sb);  
         
     ```
     ```
     public static void main(String[] args) throws Exception{  
         /* 
         User u = new User(); 
         u.age = 12; //set 
         System.out.println(u.age); //get 
         */  
                   
         //獲取類  
         Class c = Class.forName("User");  
         //獲取id屬性  
         Field idF = c.getDeclaredField("id");  
         //實(shí)例化這個(gè)類賦給o  
         Object o = c.newInstance();  
         //打破封裝  
         idF.setAccessible(true); //使用反射機(jī)制可以打破封裝性,導(dǎo)致了java對(duì)象的屬性不安全。  
         //給o對(duì)象的id屬性賦值"110"  
         idF.set(o, "110"); //set  
         //get  
         System.out.println(idF.get(o));  
     }  
    
     ```
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,767評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,688評(píng)論 0 11
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,837評(píng)論 0 11
  • 已經(jīng)不止一次掉入這個(gè)坑:特意空出大塊的時(shí)間思考方向、戰(zhàn)略,結(jié)果浪費(fèi)了大塊的時(shí)間。 不是說這種方式不好、不需要這樣做...
    ITJason閱讀 42評(píng)論 0 0
  • 那天你悄悄趴到我的耳邊 無意中吹癢我的耳緣 但我臉紅心跳的樣子你沒發(fā)現(xiàn) 你只是想找個(gè)朋友傾訴在口耳之間 . 你說著...
    水搖絹閱讀 115評(píng)論 0 0