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

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…