(Java基礎--反射)框架的概念及用反射技術開發框架的原理


一、概述

1、框架:通過反射調用Java類的一種方式。

        (框架與房子非常類似,使用的用戶寫的程序寫配置文件,就相當於給房子裝修)

        如房地產商造房子用戶住,門窗和空調等等內部都是由用戶自己安裝,房子就是框架,用戶需使用此框架,安好門窗等放入到房地產商提供的框架中。

        框架和工具類的區別:工具類被用戶類調用,而框架是調用用戶提供的類。

2、框架機器要解決的核心問題:

        我們在寫框架(造房子的過程)的時候,調用的類(安裝的門窗等)還未出現,那么,框架無法知道要被調用的類名,所以在程序中無法直接new其某個類的實例對象,而要用反射來做。

3、簡單框架程序的步驟:

        1)右擊項目File命名一個配置文件如:config.properties,然后寫入配置信息。如鍵值對:className=java.util.ArrayList,等號右邊的配置鍵,右邊是值。

        2)代碼實現,加載此文件:

                ①將文件讀取到讀取流中,要寫出配置文件的絕對路徑。

                    如:InputStream is=new FileInputStream(“配置文件”);

                ②用Properties類的load()方法將流中的數據存入集合。

                ③關閉流:關閉的是讀取流,因為流中的數據已經加載進內存。

        3)通過getProperty()方法獲取className,即配置的值,也就是某個類名。

        4)用反射的方式,創建對象newInstance()。

        5)執行程序主體功能

 

FileInputStream fileInputStream = new FileInputStream("config.properties");  
Properties properties = new Properties();  
properties.load(fileInputStream);  
fileInputStream.close();  
String className =properties.getProperty("className");  
ArrayList   arrayList = (ArrayList)Class.forName(className).newInstance();

 

用類加載器的方式管理資源和配置文件

 

二、類加載器

 

1、簡述:類加載器是將.class的文件加載進內存,也可將普通文件中的信息加載進內存

    spring這些框架加載配置文件

2、文件的加載問題:

        1)eclipse會將源程序中的所有.java文件編譯成.class文件,然后放到classPath指定的目錄中去。並且會將非.java文件原封不動的復制到.class指定的目錄中去。在運行的時候,執行的是.class文件。

        2)將配置文件放到.class文件目錄中一同打包,類加載器就會一同加載。

3、資源文件的加載:是使用類加載器。

        1)由類加載器ClassLoader來加載進內存,即用getClassLoader()方法獲取類加載器,然后用類加載器的getResourceAsStream(String name)方法,將配置文件(資源文件)加載進內存。利用類加載器來加載配置文件,需把配置文件放置的包名一起寫上。這種方式只有讀取功能。

       2)Class類也提供getResourceAsStream方法來加載資源文件,其實它內部就是調用了ClassLoader的方法。這時,配置文件是相對類文件的當前目錄的,也就是說用這種方法,配置文件前面可以省略包名。

       如:類名.class.getResourceAsStream(“資源文件名”)

4、配置文件的路徑問題:

        1)用絕對路徑,通過getRealPath()方法運算出來具體的目錄,而不是內部編碼出來的。

        一般先得到用戶自定義的總目錄,在加上自己內部的路徑。可以通過getRealPath()方法獲取文件路徑。對配置文件修改是需要要儲存到配置文件中,那么就要得到它的絕對路徑才行,因此,配置文件要放到程序的內部。

        2)name的路徑問題:

                ①如果配置文件和classPath目錄沒關系,就必須寫上絕對路徑,

                ②如果配置文件和classPath目錄有關系,即在classPath目錄中或在其子目錄中(一般是資源文件夾resource),那么就得寫相對路徑,因為它自己了解自己屬於哪個包,是相對於當前包而言的。

示例:

/** 
     * 類加載器不但可以加載類,也可以加載配置文件 
     */  
    //在classpath指定的目錄下逐一的查找要加載的哪個文件  
    //  注:com前不能加 / "com/Reflection/config.properties" 表示的是從根目錄開始查找,  
    InputStream fileInputStream =  ReflectTest.class.getClassLoader().getResourceAsStream("com/Reflection/config.properties");  
      
    Properties properties = new Properties();  
    properties.load(fileInputStream);  
    fileInputStream.close();  
    String className =properties.getProperty("className");  
    ArrayList   arrayList = (ArrayList)Class.forName(className).newInstance();  
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM