反射创建对象_如何应用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.mzph.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 …

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…

门道多:一次MaxCompute PS任务的问题排查之旅

关于PS是什么&#xff0c;可以参考一下以下两个介绍&#xff1a;基于参数服务器的大规模在线学习算法和Parameter Server。更多问题可以咨询玄乐。下面主要总结一下这回遇到一个PS任务跑不起来的问题排查过程。不想看过程的直接看最后一点总结就行。一 为什么要分享一个问题排查…

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…

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…

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…

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…

scala case class 继承_数字硬件系统设计之一:Scala快速入门(2)

原想简单笼统介绍一下scala&#xff0c;后感觉这么做意思不大&#xff0c;网友看了和没看一样&#xff0c;还是应该稍微详细具体一点&#xff0c;故而把系列编号由(上)(中)(下)&#xff0c;改为(上)(2)(3)(4)(5)....,(上)就是(1)吧&#xff0c;以下内容部分节选于我们即将出版的…

crontab命令

前一天学习了 at 命令是针对仅运行一次的任务&#xff0c;循环运行的例行性计划任务&#xff0c;linux系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作&#xff0c;因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划…

求圆和椭圆上任意角度的点的坐标

圆上任意角度的点的坐标 如上图&#xff0c;给定圆心&#xff08;Cx,Cy&#xff09;,半径为R&#xff0c; 求θ\thetaθ对应的点的坐标&#xff1f; 此处θ\thetaθ是相对于水平轴的角度。 显然我们可以使用极坐标转换来求&#xff1a; {pxCxRcos(θ)pyCyRsin(θ)\left\{\begi…

smtp中mailfrom是必须的吗_你是住在高层建筑中吗?这是你必须了解的

01PARTONE消防电梯和普通客梯的作用及特点1.消防电梯是在建筑物发生火灾时供消防人员进行灭火与救援使用且具有一定功能的电梯。因此&#xff0c;消防电梯具有较高的防火要求&#xff0c;其防火设计十分重要。2.普通电梯均不具备消防功能&#xff0c;发生火灾时禁止人们搭乘电梯…

c++ 函数的值传递,引用传递 和 引用返回的探索

2019独角兽企业重金招聘Python工程师标准>>> 前言 C的函数参数和返回分为按值传递和按引用传递,应用到类上面,会涉及到类的 赋值操作 复制函数 构造函数 析构函数 虽然java开发了两年,但对我而言c我还只是一个初学者.c还有很多陌生的特性需要自己亲自探索.这里用实际…

GCD的部分总结

GCD是基于C语言的底层API,用Block定义任务用起来非常灵活便捷. GCD的基本思想是就将操作放在队列中去执行 (1)操作使用Blocks定义(2)队列负责调度任务执行所在的线程以及具体的执行时间(3)队列的特点是先进先出(FIFO)的&#xff0c;新添加至对列的操作都会排在队尾关于多线程的…

多线程编程2-NSOperation

本文目录 前言一、NSInvocationOperation二、NSBlockOperation三、NSOperation的其他用法四、自定义NSOperation回到顶部前言 1.上一讲简单介绍了NSThread的使用&#xff0c;虽然也可以实现多线程编程&#xff0c;但是需要我们去管理线程的生命周期&#xff0c;还要考虑线程同步…

闪回表操作语法+使用闪回删除

闪回表操作语法 flashback table 【 schema.】 table_name to {【before drop 【rename to new_table_name】 】|【scn | timestamp 】】 expr 【enable | disable 】 triggers}: 参数说明&#xff1a; schema&#xff1a;用户模式 before drop&#xff1a;表示恢复到删除…

欧拉函数 - HDU1286

欧拉函数的作用&#xff1a; 有[1,2.....n]这样一个集合&#xff0c;f(n)这个集合中与n互质的元素的个数。欧拉函数描述了一些列与这个f(n)有关的一些性质&#xff0c;如下&#xff1a; 1、令p为一个素数&#xff0c;n p ^ k&#xff0c;则 f(n) p ^ k - p ^ (k-1) 2、令m&…

其中一个页签慢_渭南提升一个大专学历的有效方法

渭南提升一个大专学历的有效方法&#xff0c;宏德教育&#xff0c;目前已形成以高等学历教育为特色王牌&#xff0c;职称考评、企业内训为辅助的强力优势品牌。渭南提升一个大专学历的有效方法&#xff0c; 获得发明专利或实用新型专利&#xff0c;且已实施取得效益。出版本专业…

《收集苹果》 动态规划入门

问题描写叙述 平面上有N*M个格子&#xff0c;每一个格子中放着一定数量的苹果。你从左上角的格子開始&#xff0c;每一步仅仅能向下走或是向右走&#xff0c;每次走到一个格子上就把格子里的苹果收集起来&#xff0c;这样下去&#xff0c;你最多能收集到多少个苹果。 输入&…