当前位置: 首页 > 编程日记 > 正文

利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

作者:54dabang

在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后。我们能够让SPRING充当各框架中的整合器。把技术框架进行完美的结合)。

Spring实现的一个重要的机制是通过反射(java.lang.reflect)读取配置文件,通过配置文件来动态生成配置文件里的类对象。Java动态载入类主要是为了不改变主程序代码。通过改动配置文件就能够操作不同的对象运行不同的功能

因为java是强类型语言。本文依据一篇老外的博客。给出了一种能够实现动态类型转换的可行性方法和思路。

本文主要帮助你完毕一下学习目标:

(1)反射机制最基础的学习。

(2)    通过最基础的java正則表達式读取配置文件,获取须要的信息。

(3)    模拟spring的IOC机制,实现类的动态载入。

(4)    给出程序源代码。測试,总结

(5)    利用java反射机制来实现动态类型转换(待完毕)

一 java反射机制最基础的学习

(1)关于java反射机制最基础的学习能够參考博客

http://blog.csdn.net/xiaoxian8023/article/details/9206055,内容比較具体。可是这篇文章里查找方法时。仅仅能依据methodName进行查找,无法精确查找到重载的方法(依据參数查找)。

这里讲两种方式列出来:

A)仅仅通过方法的名字进行查找 并调用 參数:被调用对象的实例 方法名 方法调用所须要的參数

public Object invokeMethodGernaral(Object owner,String methodName,Object[]args) {//a.先获取对象所属的类Class ownerClass=owner.getClass();Method method=null;Object result=null;//b.获取须要调用的方法for(Method m:ownerClass.getDeclaredMethods()){if(m.getName().equalsIgnoreCase(methodName)){method=m;break;}}try {//c.调用该方法result=method.invoke(owner, args);//调用方法} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}

B)仅仅通过方法的名字和參数进行精确匹配查找 并调用 參数:被调用对象的实例 方法名 參数的类型 方法调用所须要的參数

<pre name="code" class="java">public Object invokeMethod(Object owner,String methodName,Class[]clz,Object[] args) throws Exception {  //a.得到对象所属类    Class ownerClass=owner.getClass();//b.依据方法名称和參数名称 获取该类的某个方法   Method method=ownerClass.getMethod(methodName,clz);//第二个參数是通过类型来获取 有个缺点就是參数类型必需要填写//c.运行某个对象的方法  Object result=method.invoke(owner,args); //必需要有类对象才干够调用//d.输出结果信息  System.out.println("结果返回值:"+ result);  return result;  }  

二 通过最基础的java正則表達式读取配置文件,获取须要的信息。

从配置文件中读取信息,主要是用到IO流的操作,比較简单。为方便大家理解,我这里将其简化为一个字符串,然后利用正則表達式从中提取信息。

关于正則表達式的具体学习,能够參考我的博客:

http://blog.csdn.net/leixingbang1989/article/details/26486927

比如要匹配一下类型的字符串:

<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">

当中标红的部分为想要获取的数据。注意这里要获取的数据长度不固定,而且可能为unicode

Gb2312等其它编码类型,在这里我们所希望获取的是其编码方式。

这里给出一段最简单的代码:


public static String parse (String s)
{Pattern pattern =Pattern.compile("charset=(.+?)\"");//通配符中也要增加转移字符 (.+?)代表要查找的内容Matcher matcher=pattern.matcher(s);while(matcher.find()){System.out.println(matcher.group(1));}return s;
}

三 模拟spring的IOC机制。读取配置文件,实现类的动态载入

Spring的一个配置文件格式例如以下:

<beans><bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" ></bean><bean id="userService" class="com.bjsxt.service.UserService" ><property name="userDAO" bean="u"/></bean>
</beans>

我们能够用Pattern pattern =Pattern.compile("<beans>(.+?

)</beans>");来获取bean对象配置信息。然后再次利用正則表達式获取每一个bean信息。

在这里 我自己定义了一个配置文件信息,放到字符串中。

其配置格式为: 属性名称:值,

String Configure="Class:com.bjsxt.service.school,Method:getStudentInfo,args:Tom,argsType:java.lang.String";//格式固定 能够用正則表達式提取String []split={":",","};//格式为   name:value, 所以分隔符为 : , parseData p=new parseData(Configure);//实现方式为正則表達式提取须要的字符串//(1) 获取类名 方法名 參数 參数类型信息  String className= p.getInfo("Class", split);String MethodName=p.getInfo("Method", split);String arg=p.getInfo("args", split);Object []args={arg};String argsType=p.getInfo("argsType", split);

给出程序源代码,測试,总结

package com.bjsxt.service;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class DynamicInvocation {public static void main(String[] a) throws Exception {String Configure="Class:com.bjsxt.service.school,Method:getStudentInfo,args:Tom,argsType:java.lang.String";//格式固定 能够用正則表達式提取String []split={":",","};//格式为   name:value, 所以分隔符为 : , parseData p=new parseData(Configure);//实现方式为正則表達式提取需要的字符串//(1) 获取类名 方法名 參数 參数类型信息  String className= p.getInfo("Class", split);String MethodName=p.getInfo("Method", split);String arg=p.getInfo("args", split);Object []args={arg};String argsType=p.getInfo("argsType", split);//(2) 创建未知对象实例Object s=Class.forName(className).newInstance();// 注意我们眼下创建的对象并不知道其类型//(3)方法调用//3.1仅通过方法名查找查找方法并调用 缺点:有可能有方法是重载的DynamicInvocation inv=new DynamicInvocation();inv.invokeMethodGernaral(s, MethodName, args);//3.2通过方法名 和參数 查找方法并调用Class cls=Class.forName(argsType);System.out.println(cls.getName());Class []clz={cls};inv.invokeMethod(s, MethodName, clz, args);//(4)动态强制类型转换Class intClass=Class.forName("java.lang.Integer");System.out.println(Integer.class);}public Object invokeMethodGernaral(Object owner,String methodName,Object[]args)//仅仅通过方法的名字进行查找 并调用{//a.先获取对象所属的类Class ownerClass=owner.getClass();Method method=null;Object result=null;//b.获取需要调用的方法for(Method m:ownerClass.getDeclaredMethods()){if(m.getName().equalsIgnoreCase(methodName)){method=m;break;}}try {//c.调用该方法result=method.invoke(owner, args);//调用方法} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}public Object invokeMethod(Object owner,String methodName,Class[]clz,Object[] args) throws Exception {  //a.得到对象所属类    Class ownerClass=owner.getClass();//b.依据方法名称和參数名称 获取该类的某个方法   Method method=ownerClass.getMethod(methodName,clz);//第二个參数是通过类型来获取 有个缺点就是參数类型必需要填写//c.运行某个对象的方法  Object result=method.invoke(owner,args); //必需要有类对象才干够调用//d.输出结果信息  System.out.println("结果返回值:"+ result);  return result;  }  
}

package com.bjsxt.service;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class parseData {private String strSource;//数据源public parseData(String s){this.strSource=s;}public  String getInfo(String name,String []split)//名称。值,分隔符{String str=name+split[0]+"(.+?

)"+split[1]; //System.out.println(str); Pattern pattern =Pattern.compile(str);//匹配的模式 Matcher matcher=pattern.matcher(this.strSource); String value=""; boolean isFind=false; if(matcher.find()) { value=matcher.group(1); }else//可能是最后一个字符 { pattern=Pattern.compile(name+split[0]+"(.+?

)"+"$");//$ 表示为限定结尾 matcher=pattern.matcher(this.strSource); if(matcher.find()) { value=matcher.group(1); } } return value; } }


五 利用java反射机制来实现动态类型转换(待完毕)

主要实现思想来自于老外的一篇博客:

http://prajith-javatechnical.blogspot.in/2014/09/casting-java-object-dynamically-using.html

因为今天老师给我安排了任务,我将在未来有时间的情况下。将博客翻译成中文并解析。






本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5257687.html,如需转载请自行联系原作者

相关文章:

C#操作消息队列

public class QueueManage { /// /// 发送对象到队列中 /// /// 队列名称&#xff0c;因为队列名称在一个应用中应该不改变的&#xff0c;所以大家最好写在配置文件中 /// 要发出去的对象 public static void SendQueue(string QueuePath,MyBase.SmsQueue sq) { Syste…

2021《程序员》数字科技企业研发实力榜TOP50

互联网的盛行带来了众多数字科技企业的崛起&#xff0c;但如何客观地衡量每家企业的技术实力&#xff1f;研发投入、研发人才的数量和人才密度是关键指标。2021年5月,《程序员》根据相关企业披露的财报数据及市场调研数据&#xff0c;整理发布“2021数字科技企业研发实力榜TOP5…

eclipse中java项目转换为web项目

2019独角兽企业重金招聘Python工程师标准>>> 经常在eclipse中导入web项目时&#xff0c;出现转不了项目类型的问题&#xff0c;导入后就是一个java项目&#xff0c;有过很多次经历&#xff0c;今天也有同事遇到类似问题&#xff0c;就把这个解决方法记下来吧&#x…

MySQL · 引擎介绍 · Sphinx源码剖析(三)

在本节中我会介绍Sphinx在构建索引之前做的一些事情&#xff0c;主要是从mysql拉取数据保存&#xff0c;然后分词排序保存到内存等等一系列的操作。下面是几个相关指令 sql_query \SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, \title, content \FROM doc…

C#给图片添加版权信息

现在越来越多的网站都喜欢将用户上传的图片加上网站的版权信息&#xff0c;不要以为那是用photoshop之类的图片处理软件加上去的&#xff0c;其实我们只要写一小段代码&#xff0c;就可以实现这个功能。 添加版权信息的原理其实挺简单&#xff1a;通过图片获取Graphics类的对象…

Python + 爬虫:可视化大屏帮你选粽子

来源 | 数据分析与统计学之美头图 | 下载于ICphoto端午节快要到了&#xff0c;旅游&#xff1f;回家&#xff1f;拜访亲友&#xff1f;少不了要带上粽子。那么&#xff0c;选择什么牌子的粽子呢&#xff1f;选择什么口味的粽子呢&#xff1f;选择什么价格区间呢&#xff1f;今年…

adviser vs mentor

研究生或博士生提到自己导师的时候是说adviser呢&#xff1f;还是mentor呢&#xff1f; 至少我认识一个Berkeley的博士是说adviser的。 另外&#xff0c;我的导师也是说adviser。 那还是说adviser吧……

T extends Serializable这是什么意思呢?看明白这个,你的问题就自然而然的明白了!...

1.转自&#xff1a;https://blog.csdn.net/liwenqiang758/article/details/8131185 自己动手丰衣足食!!! 泛型是Java SE 1.5的新特性&#xff0c;泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、接口和方法的创建中&a…

C#中switch语句注意

大家肯定对switch语句并不陌生&#xff0c;它能够让程序根据控制表达式的值&#xff0c;从多个动作中作出选择(从逻辑过程看&#xff0c;和多分支语句if&#xff0d;else有些相似)。在C和java中也有这一语句&#xff0c;不过在C#中&#xff0c;这一语句则有了些变化。先看下边一…

对Cost (%CPU) 粗略的理解

今天研究执行计划&#xff0c;看到执行计划里面有Cost (%CPU)&#xff0c;我这边研究了一把&#xff0c;不知道对与否&#xff0c;拿出来晒晒在Oracle 10g中&#xff0c;Oracle 把CPU的cost也统计在执行计划中去了&#xff0c; 这和以前的8i,9i(9i其实已经开始了)有很大的不同。…

后疫情时代,RTC期待新的场景大爆发

整理 | 寇雪芹头图 | 下载于ICphoto出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09; 过去的一年中&#xff0c;新冠疫情悄然改变了社会发展和人们的生活&#xff0c;也助推了实时音视频&#xff08;Real-Time Communication&#xff09;技术的落地应用&#xff0c;数…

JS-DOM-元素节点

查看元素节点: 1、getElementById():通过 id 取到唯一节点;如果 id 重名,只能取到第一个 getElementByName(): 通过name属性 getElementByTagName(): 通过标签名 getElementByClassName(): 通过class名 获取元素节点时,一定要注意:获取节点的语句,必须在 DOM 渲染完成之后执行。…

现代软件工程 第十章 【典型用户和场景】 练习与讨论

1. 讨论&#xff1a;下面的老板犯了什么错误? 只看用户的表面语言或行动还是不够的。我们还要找到用户语言行动背后的动机! (图像来源: http://www.weibo.com/funnyshoelace) 2. 是否要文档 有人说&#xff0c;我们敏捷的团队&#xff0c;就喜欢直接的面对面的交流&#xff0…

赠书 | 读懂生成对抗神经网络 GAN,看这文就够了

生成对抗神经网络&#xff08;Generative Adversarial Nets&#xff0c;GAN&#xff09;是一种深度学习的框架&#xff0c;它是通过一个相互对抗的过程来完成模型训练的。典型的GAN包含两个部分&#xff0c;一个是生成模型&#xff08;Generative Model&#xff0c;简称G&#…

把Doc文档转换成rtf格式

先在项目引用里添加上对Microsoft Word 9.0 object library的引用。 using System; namespace DocConvert { class DoctoRtf { static void Main() { //创建一个word的实例 Word.Application newApp new Word.Application(); // 指定源文件和目标文件 object Source&quo…

中国书法的造型元素与原理 刘彦湖

为什么80%的码农都做不了架构师&#xff1f;>>> --------------------------------------------------------------------------------中国书法的造型元素与原理 刘彦湖 中国书法是用最基本的元素遵从中国人特有的形式原则建构起来的大厦。 对于元素及其品质的认…

融云任杰:强互动,RTC 下一个“爆点”场景 | 拟合

从无序中寻找踪迹&#xff0c;从眼前事探索未来。2021 年正值黄金十年新开端&#xff0c;CSDN 以中立技术社区专业、客观的角度&#xff0c;深度探讨中国前沿 IT 技术演进&#xff0c;推出年度重磅企划栏目——「拟合」&#xff0c;通过对话企业技术高管大咖&#xff0c;跟踪报…

推荐一个个人感觉比较有吸引力的网站

2019独角兽企业重金招聘Python工程师标准>>> 廖雪峰的官方网站 转载于:https://my.oschina.net/AaronCN/blog/294293

C# 2进制、8进制、10进制、16进制...各种进制间的轻松转换

在.NET Framework中&#xff0c;System.Convert类中提供了较为全面的各种类型、数值之间的转换功能。其中的两个方法可以轻松的实现各种进制的数值间的转换&#xff1a; Convert.ToInt32(string value, int fromBase)&#xff1a; 可以把不同进制数值的字符串转换为数字&#x…

solrj操作单机solr

2019独角兽企业重金招聘Python工程师标准>>> 在目前的生产过程中全文检索技术应用越来越广&#xff0c;其中涌现了一批非常好得开源搜索引擎框架&#xff0c;如solr,elasticsearch等等。其中我工作使用最多的是solr&#xff0c;并在此对之前工作做一个总结。 solr的…

基于微软开源深度学习算法,用 Python 实现图像和视频修复

‍‍作者 | 李秋键编辑 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;图像修复是计算机视觉领域的一个重要任务&#xff0c;在数字艺术品修复、公安刑侦面部修复等种种实际场景中被广泛应用。图像修复的核心挑战在于为缺失区域合成视觉逼真和语义合理的像素&…

C#实现光盘做启动盘

一 &#xff1a;编程思想 1、创建启动盘 插入要创建的启动盘&#xff0c;程序自动检测光驱中光盘&#xff0c;利用WMI&#xff08;Windows管理架构&#xff1a;Windows Management Instrumentation&#xff09;读取该光盘的序列号&#xff08;具有唯一性&#xff09;&#xf…

为云服务立规矩——首批可信云服务认证名单公布

俗话说&#xff0c;没有规矩不成方圆。在云服务蓬勃发展的今天&#xff0c;无论从规范行业发展&#xff0c;还是为用户提供保障&#xff0c;推动政府云服务采购的角度来说&#xff0c;云服务市场都需要立规矩。7月15日至16日&#xff0c;以“可信中国云&#xff0c;未来新生态”…

Java:多个文档合并输出到一个文档

多个文档合并输出到一个文档 方法&#xff1a;Java NIO package First;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel;public class Test {pu…

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1元素2元素3元素4元…

C# POP3编程

POP3的使用很简单,所以.net没有向SMTP那样给出相应的类来控制. 废话少说,程序员最需要的使代码,:)! 1.打开VS.NET 2003. 2.新建一个WinForm Application. 3.添加命名空间 using System; using System.Drawing; using System.Collections; using System.ComponentModel; usi…

终于有人把 Python 讲清楚了!

Python因为其优越的特性广泛应用于数据分析、人工智能、Web开发、后端开发、自动化测试/运维、爬虫等领域&#xff0c;也得到了很多企业的青睐。甚至连BATZJ的技术大牛&#xff0c;都无可否认Python现在对于一个程序员发展的重要性&#xff01;最近一两年&#xff0c;我身边也有…

ASP.NET Core的配置(5):配置的同步[设计篇]

本节所谓的“配置同步”主要体现在两个方面&#xff1a;其一&#xff0c;如何监控配置源并在其变化的时候自动加载其数据&#xff0c;其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步&#xff1b;其二、当Configuration对象承载的配置放生变换的时候如何向…

C#分析数据库结构,使用XSL模板自动生成代码

<html> <head> <TITLE>分析数据库结构,自动生成代码</TITLE> <meta http-equiv"Content-Type" content"text/html; charsetgb2312"> </head> <frameset cols"237,767" rows"*"> <…

超棒整理 | Python 关键字知识点大放送

作者 | 黄伟呢来源 | 数据分析与统计学之美其实前面我已经为大家总结了《Python系统关键字 “超全总结” 及其 “含义”》。今天呢&#xff0c;我将对每一个关键字列出一个例子&#xff0c;供大家参考学习和记忆。1、and、or、notand、or、not关键字都是逻辑运算符&#xff0c;…