软件项目实训及课程设计指导——如何应用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的内容片段的图示。

(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),并通过标签定义某个类的对象实例的基本信息。

采用Spring应用框架中依赖注入技术能够更简洁地实现GOF工厂模式相同的效果,因为Spring应用框架系统程序会对开发人员所提供的XML配置文件中的各个配置项目信息进行解析,然后利用Java语言中的反射技术,并根据在XML配置文件中所给出的类名生成对应的类对象实例。

如何在J2EE系统平台项目中实现性能监控、安全控制等方面功能

如何应用GOF设计模式中的构建者模式创建复合对象实例

如何应用GOF设计模式中的创建型模式实现松耦合地创建对象实例

如何合理地创建对象实例以降低程序类之间关系的耦合度

软件项目实训及课程设计指导—如何在数据持久层中应用DAO模式

如何正确应用Web MVC架构模式分离表示层和模型层耦合关系

反射创建对象_如何应用Java反射技术灵活地创建程序类的对象实例相关推荐

  1. java反射 用处_浅谈Java反射

    一.何为反射 反射就是对于任何一个类都能知道这个类的的所有属性和方法,并且对于任何一个对象都能调用他的属性和方法,而且能修改其属性. 二.反射的作用 就我的理解来看,通常我们在写代码的时会非常强调代码 ...

  2. java 反射创建对象并赋值_java使用反射创建并操作对象的方法

    Class 对象可以获得该类里的方法(由 Method 对象表示).构造器(由 Constructor 对象表示).成员变量(由 Field 对象表示),这三个类都位于 java.lang.refle ...

  3. java .class 实例对象_通过Class类获取对象(实例讲解)

    通过Class对象获取对象的方式是通过class.newInstance()方式获取,通过调用默认构造参数实例化一个对象. /** * Created by hunt on 2017/6/27. * ...

  4. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  5. 反射创建对象_面试题汇集——java反射

    反射是动态获取信息以及动态调用对象的方法,在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:并且对于任意一个对象,都能够调用它的任意一个方法. 1.除了使用new创建对象之外,还可以用 ...

  6. 多方法接口回调_啊?Java反射遇到接口

    本文适合有点Java反射基础的同学,在Java反射调用方法时遇到接口参数是一件很蛋疼的事情. 在反射调用方法时需要传参数,像传递基本数据类型进去用就完事,传个对象进去怎么整都没关系,因为你在外部有对象 ...

  7. 如何理解java反射_如何理解java反射?

    一.反射基本概念 反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产 ...

  8. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  9. 如何理解java反射_怎么理解java反射

    怎么理解java反射? 概述 Java 反射是可以让我们在运行时获取类的方法.属性.父类.接口等类的内部信息的机制.也就是说,反射本质上是一个"反着来"的过程.我们通过new创建一 ...

最新文章

  1. python适合零基础学习吗-Python适合不适合零基础学习呢?老男孩教育
  2. 液冷模块是什么?有什么作用与意义?
  3. 2016年第七届蓝桥杯 - 国赛 - Java大学C组 - A. 平方末尾
  4. CCF201709-1 打酱油(100分)【水题】
  5. 项目常用工具类整理(二)--ckeditor的引用
  6. Unity3D(四)Camera和SkyBox
  7. 未来教育计算机19二级视频百度云,未来教育 MS office二级视频讲解
  8. 国家对五险一金的交纳说明(已更新)
  9. 计算机联锁论文开题报告,学生论文开题报告评语
  10. 【转】ADW_Launcher
  11. idea 使用markdown总结
  12. 小米10T和小米10T Pro的区别
  13. 为什么发动机需要吸入大量的空气?
  14. Oracle DB 备份和恢复的概念
  15. HTML5,js制作坦克大战
  16. 由Elasticsearch的API命令,引发的金融业生产故障
  17. 全网最通俗的条件随机场CRF
  18. 开发者要求改进:苹果商店缺乏应用推广方式
  19. 电商系统中微服务体系中的分层设计和领域划分
  20. Proteus元件库对照表常用器件的英文名称(附元件库资源包和DOC文档)

热门文章

  1. 页面添加复制代码功能
  2. MVC中validateRequest=false不起作用
  3. 还是动态生成一个控件
  4. Angular rxjs Subject笔记
  5. JS和安卓 IOS的交互 例子式记录
  6. jquery正则表达式验证:验证全是数字
  7. 《SpringBoot揭秘 快速构建微服务体系》读后感(三)
  8. 51nod 1004 【快速幂】
  9. iOS tabview 适配问题
  10. WebApp匯入資料之From Excel