反射創建對象_如何應用Java反射技術靈活地創建程序類的對象實例

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

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

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

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

bc664b394d45422c608ebfd872c5dff8.png

利用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方法獲得指定屬性項目的內容。

f006b4e1d7a6236f605e7d56fbcb19eb.png

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

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

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

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

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

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

01b7062bc8d4f8437f6eb3e07708fd28.png

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

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

99740bc9aba93833d043060b8038405a.png

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

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

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

e0a37d57434a7ee132a9756724971a6a.png

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

f1ac7341a59fdd31cc38b3b4a7696fde.png

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

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

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

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

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

1ec35d8be394ea864de84af0e73d7d9f.png

由于在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),并通過標簽定義某個類的對象實例的基本信息。

ac11783ed09f054db4d38ef4f4233b17.png

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

如何在J2EE系統平臺項目中實現性能監控、安全控制等方面功能

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

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

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

軟件項目實訓及課程設計指導—如何在數據持久層中應用DAO模式

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js回到頂部

2019獨角獸企業重金招聘Python工程師標準>>> <html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"> <title></title> <style type"text/css"> #control_pannel …

java 產生的固體物的基礎上 增刪改的SQL聲明

經過多次修改。最后版本。package com.power.sql;import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; import java.util.Vector;import org.apache.commons.lang3.reflect.FieldUtils; /*** author Gary Huang* 博客地址&#xff1a;…

OSEK簡介

What is OSEKA specification for an RTOS?With standard software interfaces (OS API)?Including intertask & interprocessor communication (COM)?Including network management (NM)?Including the language used to statically declare OS elements used in an a…

python中布爾型的值_在python中對于bool布爾值的取反操作

背景根據公司業務的需求&#xff0c;需要做一個對于mysql數據庫的大批量更新。腳本嘛也是干干單單。使用了redis的隊列做緩存&#xff0c;可以異步并發的多任務進行更新。有點難受的地方在于&#xff0c;請求訪問時&#xff0c;因為一些網速&#xff0c;速率之內的原因&#xf…

門道多:一次MaxCompute PS任務的問題排查之旅

關于PS是什么&#xff0c;可以參考一下以下兩個介紹&#xff1a;基于參數服務器的大規模在線學習算法和Parameter Server。更多問題可以咨詢玄樂。下面主要總結一下這回遇到一個PS任務跑不起來的問題排查過程。不想看過程的直接看最后一點總結就行。一 為什么要分享一個問題排查…

源碼安裝Bazel

有時候我們需要源碼安裝tensorflow&#xff0c;這時逃不過的第一步就是安裝Bazel,如果沒有root權限的時候&#xff0c;這時我們就需要源碼安裝Bazel了。下面是安裝步驟&#xff0c;參考&#xff1a;https://docs.bazel.build/versions/master/install-compile-source.html 1. E…

234. Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 先找到鏈表中點&#xff0c;將第二部分反轉&#xff0c;然后比較兩部分鏈表的值。 /** * Definition for singly-linked list. * public class ListNo…

當查找名字的時候通過外圍作用域向外查找(如何理解)

int a;//#1int b;//#2namespace A{int c;//#3void fun(){int a;//#4使用(a);//從里查找已經聲明名字首先尋找內層花括號之內a找#3//會繼續查找使用(b);//從里查找已經聲明名字//首先尋找內層花括號之內沒有聲明b//繼續外層花括號&#xff08;namespace A&#xff09;內尋找沒有…

python 服務注冊_將python程序注冊為Ubuntu系統服務,并開機啟動的方法。

一、系統環境操作系統&#xff1a;ubuntu 18 (該版本已默認使用systemd作為init)python版本&#xff1a;3.6二、步驟(一)準備python程序1、在 /usr/bin/ 下新建python程序 svc-test.py# nano /usr/bin/svc-test.py#! /usr/bin/python3import timewhile True:f open(/tmp/svc-t…

源碼安裝NASM,無root權限

首先說明我的系統是redhat linux64位。沒有root權限。我們想安裝nasm2.13. 下面介紹具體的安裝步驟。 1. 下載源碼: https://www.nasm.us/pub/nasm/releasebuilds/2.13/ 選擇nasm-2.13-xdoc.tar.gz下載在本地目錄下 2. 解壓&#xff0c;tar -xvzf nasm-2.13-xdoc.tar.gz &…

Volley簡單學習使用五—— 源代碼分析三

一、Volley工作流程圖&#xff1a; 二、Network在NetworkDispatcher中須要處理的網絡請求。由以下進行處理&#xff1a;NetworkResponse networkResponse mNetwork.performRequest(request);看一下mNetwork的定義&#xff1a;&#xff08;定義在NetworkDispatcher中&#xff0…

html5 - history 歷史管理

參考文章&#xff1a; w3c : http://www.w3.org/html/ig/zh/wiki/HTML5/history 張鑫旭 : http://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/ zawa : http://zawa.iteye.com/blog/1271031  Demo : Demo 截圖&#xff…

源碼安裝libjpeg-turbo1.2.1,無root權限

首先說明我的系統是redhat linux64位。沒有root權限。我們想安裝libjpeg-turbo. 下面介紹具體的安裝步驟。 本來想安裝最新的版本&#xff0c;但是最后失敗了&#xff0c;無奈安裝成1.2.1. 1. 下載源碼&#xff1a; https://zh.osdn.net/projects/sfnet_libjpeg-turbo/download…

Android開發學習---使用Intelij idea 13.1 進行android 開發

Android開發學習---使用Intelij idea 13.1 進行android 開發 原文:Android開發學習---使用Intelij idea 13.1 進行android 開發1.為什么放棄eclipse?太卡!! 實在受不了eclipse的卡了,運行WEB項目還好,但android開發實在太慢,太慢!經常卡死,CPU經常被占滿! 看網上很多人都說比I…

python滑動條來設置閾值houghcircle_OpenCV Python,為什么Hough Circle Transform找不到所有圓圈?...

我搜索了很長時間可能出錯但我并不真正了解參數和預處理的影響我無法發布圖片,但是在一張非常清晰的歐元照片上,該程序識別出一些圈子,而不是其他一些圈子,甚至可以像其他人一樣清楚.這是我的代碼&#xff1a;‘$’import cv2import numpy as npfilename rC:\Users\roseline\D…

Logcat打印調試信息

Android Logcat調試中的V、D、I、W、E的分別代表什么&#xff1f; Log.v -- 黑色 -- verbose infoLog.d -- 藍色 -- debug infoLog.i -- 綠色 -- infoLog.w -- 橙色 -- warnLog.e -- 紅色 -- error info//Log.ASSERT -- 斷言 //Log.wtf() (1、Log.v 的調試顏色為黑色的&#xf…

opencv中的橢圓擬合

首先貼一個最簡單的程序&#xff1a;訪問&#xff1a;https://blog.csdn.net/guduruyu/article/details/70069426 //創建一個用于繪制圖像的空白圖 cv::Mat image cv::Mat::ones(480, 640, CV_8UC3); //設置藍色背景 image.setTo(cv::Scalar(100, 0, 0)); //輸入擬合…

unix c 11

多線程(thread) 操作系統支持多進程&#xff0c;進程內部使用多線程。 進程是 重量級的&#xff0c;擁有自己 獨立的內存空間。 線程是 輕量級的&#xff0c;不需要擁有自己 獨立的內存空間&#xff0c;線程的內存空間&#xff1a;1 共享進程的內存空間 2 每個線程擁有…

C# .net core 使用自定義的WebProxy

為什么80%的碼農都做不了架構師&#xff1f;>>> 因為.net core 的System.Net 中沒有提供WebProxy這個方法,所以可以根據需求實現一個. public class CoreWebProxy : IWebProxy{public readonly Uri Uri;private readonly bool bypass;public CoreWebProxy(Uri uri,…

2015年08月

2015年07月 - 2015年09月 ● 一般而言。。。 一般而言&#xff0c;牙周病輕者有口臭、牙齦紅腫疼痛、刷牙流血等癥狀&#xff0c;嚴重時會造成牙齦萎縮、牙齒敏感、牙齒搖動等情況。口腔沒有在飲食后30分鐘清潔就會逐漸轉化為酸性環境&#xff08;PH值約5.5&#xff09;&#x…