課程設計指導——如何應用Java反射技術靈活地創建程序類對象實例

2020-12-15 楊教授工作室

軟體項目實訓及課程設計指導——如何應用Java反射技術靈活地創建程序類的對象實例

1、如何應用屬性配置文件實現對系統中的配置信息進行讀寫操作

Java中的屬性配置文件主要可以作為軟體應用系統及項目的配置文件,比如許多J2EE的開源框架系統中都提供了屬性配置文件作為該應用框架的對外配置文件——如實現O/R Mapping技術的Hibernate應用框架中的hibernate.properties和Log4J日誌系統中的log4j.properties、Struts2應用框架中的struts.properties等屬性配置文件。

在屬性配置文件中一般是以「名字(鍵)—值對」的方式進行存儲,請見下圖所示的Struts2框架中的struts.properties文件內容的示例圖示。

利用JDK系統庫中的java.util.Properties類中的load方法可以加載屬性文件和利用Properties類中的getProperty方法獲得屬性文件中的指定屬性項目。但要注意加載屬性文件的兩種不同的形式:

(1)利用Class類中的getResourceAsStream方法

Class類中的getResourceAsStream方法是查找具有給定名稱的資源,返回 InputStream類型的對象實例。但要注意getResourceAsStream方法是相對於」/」根路徑下的位置,這樣的路徑在J2EE Web應用系統的環境下是指定為絕對路徑,如果不以」/「開頭, 則路徑是相對於這個類所在的包——也就是表示從當前類的classPath路徑找指定的文件。

(2)利用Class類中的getResource方法

Class類中的getResource方法是查找帶有給定名稱的資源路徑並返回一個URL類型的對象實例。下圖所示的程序代碼實例是示例項目銀行帳戶信息管理系統中的ClassNameConfig類的完整代碼示例截圖,其中利用static語句塊完成對屬性文件的一次性加載以提高效率——產生出單例設計模式的編程應用效果,然後再提供getProperty方法獲得指定屬性項目的內容。

2、如何實現對存儲在XML格式的配置文件中的配置信息進行讀寫操作

(1)Java屬性配置文件的方式所存在的問題

由於Java屬性配置文件是採用「名字(鍵)—值對」的方式進行存儲,因此無法體現各個「名字(鍵)」之間的層次關係和樹形結構,也就無法表達複雜的數據關係,從而導致在實際應用中受到一定的限制。

由於XML格式的標準化和XML標籤數據能夠體現數據之間的層次關係,因此應用XML格式的配置文件能夠表達樹形結構的複雜層次性的配置數據關係,能夠體現系統中的各個配置數據之間的層次性,可以應用於邏輯關係更複雜的應用場景中。

(2)在項目中採用XML格式的配置文件代替屬性配置文件

由於在軟體應用系統的配置信息中,各個配置數據之間一般都有一定的層次關係(如父子、前後等);同時為了能夠達到與系統平臺無關的配置應用要求。因此,對示例項目銀行帳戶信息管理系統中的配置信息文件從原來應用Java屬性配置文件的方式重構為XML格式的系統配置文件。下圖所示為示例項目銀行帳戶信息管理系統中的配置文件classNameConfig.xml的內容片段的圖示。

圖5.7 classNameConfig.xml的配置文件內容片段的圖示

(3)應用JDom實現對XML配置文件進行解析

JDom是一個開源項目,它基於樹型結構,利用純Java的技術對XML文檔實現解析、創建、處理和序列化以及多種操作;並充分利用了Java平臺中的優秀的特徵,如:方法重載、回收機制,和後臺處理等提高處理的效率。如下示圖為JDom官方網站中提供的下載JDom系統庫的頁面內容的局部截圖。

因此,在示例項目銀行帳戶信息管理系統的項目中決定採用JDom系統庫實現對XML格式的配置文件進行解析。

(4)在項目中添加JDom的系統包文件

讀者可以在JDom官方網站中提供的下載JDom系統庫文件的頁面中下載JDOM的JAR包文件jdom.jar,然後再將該jdom.jar文件加入到項目的類路徑中。最後的操作結果請見下圖所示。

然後再對項目中的ClassNameConfig類的代碼進行重構、並利用JDom 系統API實現對classNameConfig.xml配置文件中的XML配置信息進行解析。為了避免影響使用ClassNameConfig類的其它程序類代碼產生被動地修改,重構後的程序代碼對外的接口getProperty方法不變。重構後的代碼請見下圖所示。

3、利用Java反射技術動態創建程序類的對象實例

(1)Java反射(Reflection)機制主要提供的功能

Java程式設計師充分地應用反射技術,能夠在程序代碼中實現在運行時判斷任意一個對象所屬的類類型、也能夠在運行時構造任意一個類的對象實例,當然還能夠在運行時判斷任意一個類所具有的成員變量和方法(通過反射甚至可以調用類中的private方法)和在運行時調用任意一個類對象實例中的方法。

(2)利用Java反射技術動態創建對象實例的基本步驟

首先要獲取一個要操作的類的對象,該對象屬於java.lang.Class類的實例;然後再通過Class類中的newInstance方法動態構造出對應的類的對象實例。下圖所示為示例項目銀行帳戶信息管理系統中動態創建出AccountInfoManageInterface接口對象的工廠類AccountInfoManageFactory的代碼片段。

由於在AccountInfoManageFactory工廠類的newAccountInfoManageBean方法只接收需要創建對象的類名稱,因此可以向該方法傳遞同一接口的不同實現類名稱,也就可以實現創建出不同類的對象實例。提高了工廠類在創建對象的靈活性和代碼的可擴展性。

4、如何應用依賴注入技術高效地創建出對象實例

(1)Spring 應用框架中的控制反轉模式和依賴注入技術

1)Spring應用框架中的控制反轉模式

Spring應用框架的核心在於其提供的控制反轉(IoC,Inversion of Control)容器,而IoC容器最主要實現的功能則是為軟體應用系統提供對象管理方面的實現技術。並幫助軟體應用系統的開發者實現對軟體應用系統中的各個類進行對象實例化、建立對象之間的依賴關係、對象的緩存等與生命周期有關的各個方面的管理功能。

利用控制反轉模式能夠有效地減少對象的請求者對服務提供者的特定實現邏輯的依賴,因為應用系統中的各個組件類不再需要去查找或是實例化它們所依賴的其它的目標組件類的對象實例。

2)Spring 應用框架中的依賴注入技術

依賴注入(DI,Dependency Injection)技術是對控制反轉IoC的具體實現技術,因為它更加準確地描述了控制反轉IoC的設計理念。單純從名字上理解依賴注入的基本意思是:組件之間的依賴關係由容器在運行期決定,也就是由容器(如Spring框架的運行系統程序)動態地創建出目標類的對象實例、並將某種依賴關係注入到目標組件類中。

IoC和DI的技術本質都是希望能夠改變軟體應用系統中程序類之間的各種「依賴」關係——程序類之間的依賴關係由原來直接依賴「目標組件類」改變為依賴於「容器」。

5、Spring框架中的控制反轉模式與GOF工廠模式在實現方式方面的不同點

IOC 是一種使應用程式「邏輯外在化」的設計模式——因為提供服務的組件類的對象實例是被「注入」的而不是被「直接寫入」到請求者(客戶端)的代碼中,並將組件類之間的依賴關係轉移到系統外部的配置文件中,避免在調用類中硬編碼實現相關的功能。這樣將能夠大大地減少服務的請求者對服務提供者的特定實現邏輯的依賴——提高了軟體應用系統中的各個組件類的可移植性和可重用度。

Spring應用框架通過依賴注入技術實現了控制反轉模式,而依賴注入技術的具體實現則又是借用Java語言中的反射技術——Spring IoC容器核心程序依據開發人員在XML配置文件中所定義的類名稱和對應的對象名稱,利用反射技術動態地創建出該類的對象實例,並藉助於成員屬性的set方法或者構造方法動態地將所創建出的對象實例注入到目標類中。

6、利用Spring 控制反轉模式以XML配置文件的方式定義需要創建的目標對象

(1)應用IoC進行軟體應用系統開發時的基本要求

首先,軟體應用系統的開發人員不應該再在程序代碼中直接創建出目標類的對象實例,但是需要描述出創建它們的方式和要求。

其次,在服務請求者的程序代碼中不直接完成對服務提供者類對象的實例化工作,而只需要在XML配置文件中描述出所需要的服務組件有關的信息。

最後,程序在運行時,由Spring 應用框架中的IoC容器程序負責創建出這些對象和將這些對象關聯在一起。

(2)利用Spring 應用框架中的依賴注入技術創建對象實例

下圖所示為某個項目中的Spring IoC容器中的XML配置文件定義的片段截圖,在Spring應用框架中提供有屬性注入(Setter Injection)和構造方法注入(Constructor Injection),並通過<bean>標籤定義某個類的對象實例的基本信息。

採用Spring應用框架中依賴注入技術能夠更簡潔地實現GOF工廠模式相同的效果,因為Spring應用框架系統程序會對開發人員所提供的XML配置文件中的各個配置項目信息進行解析,然後利用Java語言中的反射技術,並根據在XML配置文件中所給出的類名生成對應的類對象實例。

如何應用GOF設計模式中的構建者模式創建複合對象實例

如何應用GOF設計模式中的創建型模式實現鬆耦合地創建對象實例

如何合理地創建對象實例以降低程序類之間關係的耦合度

如何正確地應用Web MVC架構模式分離表示層和模型處理層耦合關係

軟體項目實訓及課程設計指導—Web表示層典型功能實現的應用實例

相關焦點

  • 如何合理地創建對象實例以降低程序類之間關係的耦合度
    軟體項目實訓及課程設計指導——如何合理地創建對象實例以降低程序類之間關係的耦合度1、對象創建是面向對象OOP編程技術中不可缺少的一件事情創建類的對象實例是在所有的面向對象什麼時候應該創建類的對象實例?如何保證所創建出的類的對象實例能夠適時地被銷毀?其實上面的核心問題也就是軟體應用系統的開發人員如何能夠更高效地創建、並且松藕合、達到程序模塊的可擴展性?繼續採用如下的對象實例的創建形式嗎?
  • 如何正確地創建和銷毀軟體應用系統中JDBC資料庫連接對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中JDBC資料庫連接對象實例1、Java語言中提供有訪問資料庫系統的JDBC編程接口Java 資料庫連接技術(JDBC,Java DataBase Connectivity)其實是將Java語言與標準的
  • 如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例
    軟體項目實訓及課程設計指導——如何正確地創建和銷毀軟體應用系統中網絡通訊中的Socket對象實例1、基於TCP/IP協議的Socket通信相關的基礎知識(1)TCP/IP(Transmission Control Protocol傳輸控制協議/Internet
  • 如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息
    軟體項目實訓及課程設計指導——如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息1、什麼是策略(Strategy)設計模式策略設計模式把「算法」(也就是軟體應用系統中的業務規則或者待實現的功能等)和「環境」(封裝軟體應用系統在實際應用時的場景)相互分離
  • java創建對象的過程詳解(從內存角度分析)
    java對象的創建操作其實我在《JVM系列之類的加載機制》一文曾經提到過,包含兩個過程:類的初始化和實例化。為此為了理解的深入,我們還需要再來看一下類的生命周期。一張圖表示:從上面我們可以看到,對象的創建其實包含了初始化和使用兩個階段。有了這個印象之後,我們就能開始今天的文章了。
  • 如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能
    軟體項目實訓及課程設計指導——如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能在軟體應用系統中離不開數據訪問和數據處理兩個方面的功能,而數據處理之前首先要進行數據訪問,也就是只有快速地獲得了數據,才能進行下一步的數據處理。
  • 如何應用XML+XSLT+AJAX組合技術實現無刷新的數據查詢的應用實例
    軟體項目實訓及課程設計指導——如何應用XML +XSLT +AJAX組合技術實現無刷新的數據查詢的應用實例1、在Web應用系統項目中添加一個實現查詢的請求頁面searchBook.jsp(1)創建searchBook.jsp頁面文件的過程示圖
  • 如何應用Web頁面靜態化技術以提高J2EE Web應用系統的響應性能
    軟體項目實訓及課程設計指導——如何應用Web頁面靜態化技術提高Web應用系統的響應性能1、什麼是Web頁面靜態化技術(1)Web頁面靜態化技術將JSP動態頁面按照某種模板格式生成對應的*.html純靜態Web頁面的過程
  • 軟體項目實訓及課程設計指導——實體類結構和類關係的設計示例
    軟體項目實訓及課程設計指導——系統概要設計中的實體類結構和關係的設計示例1、軟體應用系統中的實體類及主要的作用軟體應用系統中的實體類主要是指軟體系統中代表人、地點、事物或概念等方面的數據對象。通常把業務領域中的各種名詞——例如客戶、訂單、商品等信息可以作為應用系統中的實體域對象。在如下示圖中的各個資料庫表所體現出的數據對象都可以設計為對應的實體類,然後在數據訪問邏輯組件中訪問和操作這些實體類的對象實例。
  • 如何在Web應用中實現Velocity 與Struts2框架相互集成的應用實例
    軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts2框架相互集成的應用實例1、Struts 2應用框架提供對 Velocity 和 FreeMarker 模板引擎的支持在Struts 2應用框架中不僅繼續保留有對Velocity
  • 利用java的反射實現一個超經典的案例!絕對的乾貨哦
    最近學習了一下反射,反射裡面的方法也不少,但是如果不應用起來,總感覺沒有理解他的精髓,今天就和大家講一個java反射的經典小案例,讓大家對java的反射有一個全面深刻的認識。這個小案例的需求是醬樣子的:寫一個"框架",再不能改變該類的任何代碼的前提下,他可以幫我們創建任意類的對象,也可以執行其中的任意方法。看題目是不是有點蒙,下面就帶著大家一起來寫這麼一個小框架。不管是學習,或者在以後的工作中,當我們拿到一個需求時,先不要急著開始幹活,應該分析一下,每個關鍵點,分哪些步驟等等。
  • 如何在Web應用系統表示層開發實現中應用Velocity模板技術
    軟體項目實訓及課程設計指導——如何在Web應用系統表示層開發實現中應用Velocity模板技術1、分離Web表示層的數據處理和展現邏輯的常見的應用技術分離Web表示層的數據處理和展現邏輯是目前企業級的Web應用系統開發中表現層組件開發實現中的基本實現目標。
  • 課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能
    軟體項目實訓及課程設計指導——如何應用OSCache緩存框架提高Web頁面響應性能1、緩存應用技術是提高軟體應用系統性能的最簡單和最有效的方式之一在計算機的軟硬體系統中大量地應用緩存(Cache)技術,所謂「緩存」是指位於「目標」(可以為軟體類的應用系統,也可以為硬體設備或者部件
  • 課程設計指導——如何應用XML+XSLT技術分離Web表示層數據和樣式
    軟體項目實訓及課程設計指導——如何應用XML+XSLT技術分離Web表示層數據和樣式1、「XML+XSLT」技術在J2EE技術平臺中的應用Java語言及相關的應用技術的產生解決了跨平臺的軟體應用系統的開發,但沒有解決如何實現跨平臺的數據交換問題。
  • Java 第一大框架:Spring 的 IoC 跟 AOP 雛形如何實現?
    IOC跟DI解釋如下:IOC容器(Inversion of Controller) 控制反轉Java思想是面向對象的開發,一個應用程式是由一組對象通過相互協作開發出的業務邏輯組成,那麼如何管理這些對象,使他們高效地協作呢?抽象工廠、工廠方法設計模式」可以幫我們創建對象,「生成器模式」幫我們處理對象間的依賴關係,不也能完成這些功能嗎?
  • 課程設計指導——應用AJAX技術提高Web應用系統的整體響應性能
    軟體項目實訓及課程設計指導——應用AJAX技術提高Web應用系統的整體響應性能1、軟體應用系統的性能指標是衡量軟體應用系統優劣程度的一個重要指標Web應用系統由於是基於HTTP協議產生請求、並由Web伺服器端程序處理對應的請求、最後再次通過HTTP響應向Web
  • Java 入門教程詳解
    Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。Java可運行於多個平臺,如Windows, Mac OS,及其他多種UNIX版本的系統。本教程通過簡單的實例將讓大家更好的了解JAVA程式語言。
  • EffectiveJava-1-創建和銷毀對象
    可以不用在每次調用時都創建一個新的對象,可以使用預先構建好的對象,或將構建好的對象緩存起來,進行重複利用,適用於經常請求創建相同對象,並且創建對象的代價很高,如常見的單例模式寫法就是對這一點的應用;實例受控的類:能為重複的調用返回相同的類,有助於類控制某個時刻哪些實例應該存在,功能如下:1.確保它是一個Singleton或者是不可實例化的;2.使得不可變的類不會存在兩個相等的實例
  • 2021 必須掌握的 21個Java 核心技術
    Java的運行 這條可能出看很簡單,java程序的運行誰不會呢? 不過很多時候, 我們只是單純通過IDE去執行java程序,底層IDE又是如何執行java程序呢?很多人並不了解。
  • Java面向對象之枚舉——enum
    一樣,枚舉都不會顯式地繼承Enum。枚舉中的每個常量都是全局的,每個常量都是一個實例,且因為常量個數是固定的有限個的,所以實例個數也是固定的,且枚舉類不能使用new關鍵字。枚舉實例必須位於枚舉結構體中的最開始部分,枚舉實例列表的最後必須要有分號與其他成員相分隔。