java反射jdk1.8,Java基础----jdk1.8 反射实验

Java基础----jdk1.8 反射实验

(写在最前:还没入门的搬砖工的一本正经的胡说八道)

引言:  最近做到的项目中,需要给对接方提供一个公共接口,根据对方传入的 XML 文件的 rootelement 分发调用接口,最简单的使用 if-else if 模式,但是看着实在太蠢。

场景一:需要根据关键字,进行接口分发

使用 if-else 模式缺点:看着蠢

不易阅读(个人观点)

不易维护

balabala... 不想编了,就是看着不爽

如果只有一两个方法还好,如果方法多了,额。。。如下,自行体会。

1publicclassTestMethod{

2

3publicObjectdispatchMethod(Stringname,Stringdata){

4Objectobj=null;

5

6if("methodA".equal(name)){

7obj=methodA(data);

8}elseif("methodB".equal(name)){

9obj=methodB(data);

10}elseif(...){

11...

12}

13returnobj;

14}

15

16privateObjectmethodA(Stringdata){

17...

18}

19

20privateObjectmethodB(Stringdata){

21...

22}

23

24...

25}

那么步入正题,我才用的反射模式,匹配目标方法,我认为可以降低维护和阅读成本

开发环境:jdk1.8

实现代码:定义目标方法枚举,包含 rootelement 信息,调用方法说明,目标方法 targetName

1publicenumMethodEnum{

2

3METHODA("MethodA","调用方法A","methodA"),

4METHODB("MethodB","调用方法B","methodB"),

5;

6

7@Getter

8privateStringcode;//rootelement

9

10@Getter

11privateStringmessage;

12

13@Getter

14privateString name;//目标方法名

15

16privateMethodEnum(Stringcode,Stringmessage,Stringname){

17this.code=code;

18this.message=message;

19this.name=name;

20}

21

22publicstaticMethodEnum fromCode(Stringcode){//根据传入code,筛选目标方法

23for(DockingFliggyHotelEnump:DockingFliggyHotelEnum.values()){

24if(p.code.equalsIgnoreCase(code)){

25returnp;

26}

27}

28returnnull;

29}

32}定义反射方法工具类

1

/**

2 * 定义工具类

3 **/

4publicclassMethodUtil{

56publicstaticMethodgetTargetMethod(Classclazz,StringmethodName){

7Method[]methods=clazz.getDeclaredMethods();//获取所有方法,包含private

8

if(methods!=null&&methods.length>0){

9StringregEx="^"+methodName+"$";//获取所要查找到的方法名称要匹配此正则

10Patternpattern=Pattern.compile(regEx);

11

for(Methodmethod:methods){

12Matchermatcher=pattern.matcher(method.getName());

13booleanrs=matcher.find();

14

if(rs){

15

returnmethod;

16

}

17

}

18

}

19

returnnull;

20

}

2122publicstaticObjectexecuteTargrtMethod(Classclazz,StringmethodName,StringxmlData){

23Objectobj=null;

24

try{

25Methodmethod=getTargetMethod(clazz,methodName);

26obj=method.invoke(clazz,xmlData);

27

}catch(Exceptione){

2829

}

30

returnobj;

31

}

3233

}具体分发

1publicclassTestDispatch{

2

3publicObjectdispatch(Stringroot,Stringxml){

4Stringname=MethodEnum.fromCode(root).name;

5Objectobj=executeTargrtMethod(this.getClass(),name,xml)

6returnobj;

7}

8

9privateObjectmethodA(Stringxml){

10Objectobj=null;

11...

12returnobj;

13}

14

15privateObjectmethodB(Stringxml){

16Objectobj=null;

17...

18returnobj;

19}

20

21...

22}

对于业务代码结构清晰明了,是不是看着爽多了。

对于类似的场景很多,都可以使用反射机制。

场景二:项目中多处需要大批量插入数据,提取一个公共方法,减少代码行数,何乐而不为呢?

对了,顺便说一下这个批量插入方法,数据库使用 mysql,项目框架 springboot,jdk1.8,5000 条数据插入一次,耗时 0.8s 左右。

1

/**

2 * @param batchCount 一次批量插入数据量

3 * @param target 目标方法关键字

4 * @param list 需要插入的大批量数据

5 * @throws Exception

6 */

7publicstaticvoidbatchInsert(Classclazz,intbatchCount,Stringtarget,Listlist)throwsException{

8Methodmethod=getTargetMethod(target);

9intbatchLastIndex=batchCount-1;//每批最后一个的下标

10

for(intindex=0;index

11

if(batchLastIndex>list.size()-1){

12batchLastIndex=list.size()-1;

13

if(method!=null){

14method.invoke(clazz,list.subList(index,batchLastIndex));

15

}

16

break;//数据插入完毕,退出循环

17

}else{

18

if(method!=null){

19method.invoke(clazz,list.subList(index,batchLastIndex));

20

}

21index=batchLastIndex+1;//设置下一批下标

22batchLastIndex=index+(batchCount-1);

23

}

24

}

25

}

实验结束,代码分析下次在写了。

写在最后

代码是伪代码,可能啥地方写得不对,欢迎指正

对于以上两种场景,我目前只能想到这种方法。。。如果你有更好的,欢迎来怼我

来源: http://www.cnblogs.com/frances9416/p/7119216.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ODPS的SQL语句

(一)基本概念 1.ODPS:Open Data Processing Service, 简称ODPS;是由阿里云自主研发,提供针对TB/PB级数据、实时性要求不高的分布式处理能力,应用于数据分析、挖掘、商业智能等领域;…

php.amazeui,AmazeUI 导航条的实现示例

拥有易用的导航条对于任何网站都很重要。本文主要介绍了AmazeUI 导航条的实现示例,分享给大家,具体如下:导航条Amaze UI导航切换 首页项目下拉 标题1. 去月球2. 去火星3. 还是回地球4. 下地狱5. 桥头一回首其他 注册随便看看登录....am-topba…

JNDI用法详解

JNDI全称(Java Naming and Directory Interface),是java命名和目录接口。它是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。 1、命名的概念与应用 JNDI中的命名(Nam…

django mongodb mysql,Django MongoDB Django NoSQL方案

1 安装MongoDB1,下载所需要的版本,地址:http://www.mongodb.org/display/DOCS/Downloads2,将MongoDB加入环境变量3,设定好放置数据库文件的路径,比如d:db4,打开CMD,不要关闭这个mong…

BigDecimal保留两位小数

文章目录前言1.代码实现2.方法详解注释前言 在项目中经常会用到小数的一些计算,而float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而&#xff…

matlab人民币识别,MATLAB-OCR 用MATLAB实现人民币纸币金额的识别与统计 - 下载 - 搜珍网...

用MATLAB实现人民币纸币金额的识别与统计/说明.txt用MATLAB实现人民币纸币金额的识别与统计/钞票面额识别与统计/matlab程序及图片/1-1.jpg用MATLAB实现人民币纸币金额的识别与统计/钞票面额识别与统计/matlab程序及图片/1-2.JPG用MATLAB实现人民币纸币金额的识别与统计/钞票面…

DataIntegrityViolationException: Error attempting to get column ‘xx‘——DataIntegrityViolationExceptio

一、解决办法 项目中在更新数据库时出现异常,org.springframework.dao.DataIntegrityViolationException,当然如果控制台直接报这个异常问题的解决估计也不至于让我写篇博客。 先说这个异常代表的含义吧: 这个异常的意思就是在更新&#xff…

php oracle817,Oracle 817 For Linux/Unix安装文档-数据库专栏,ORACLE

oracle 817安装文档1. 创建dba组和oracle用户roothz_cmode # groupadd dbaroothz_cmode # useradd -m -d /opt/oracle -s /bin/ksh -g dba oracleroothz_cmode # passwd oracle new password:re-enter new password:passwd (system): passwd successfully chan…

Java中new Date插入mysql数据库,数据库时间多一秒问题

这是由于new Date()时,实际上是调用的System.currentTimeMillis()方法,即获得以毫秒为级别的时间戳。 一般数据库表的字段类型datetime/timestamp长度都是设置为0。 MySQL数据库对于毫秒大于500的数据进行进位,所以就造成的MySQL中的时间多一…

学php还是golang,学swoole还是golang

Swoole是一个面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。 (推荐学习:swoole视频教程)Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏…

java8 函数编程Consumer使用详解

Consumer 源码 package java.util.function;import java.util.Objects;FunctionalInterface public interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) ->…

java解析vue对象数组,Java数组

Java提供了一个数据结构&#xff0c;所述数组&#xff0c;其存储相同类型的元件的固定大小的连续集合。数组用于存储数据集合&#xff0c;但将数组视为相同类型变量的集合通常更为有用。您可以声明一个数组变量&#xff0c;例如数字和数字[0]&#xff0c;数字[1]和...&#xff…

Java中List的subList()方法及使用注意事项

List<Object> list new Arraylist<>();List<Object> subList list.subList(0, 5);其中subList(0, 5)取得的是下标为0到4的元素,不包含下标为5的元素. java.util.List中的subList方法返回列表中指定的 fromIndex&#xff08;包括 &#xff09;和 toIndex&a…

php有关卡的消消乐源码,查看“宝可消消乐/活动关卡/得分挑战关卡/超梦”的源代码...

因为以下原因&#xff0c;您没有权限编辑本页&#xff1a;您所请求的操作仅限于该用户组的用户使用&#xff1a;用户您可以查看与复制此页面的源代码。关卡{| {{classcolortable|type|psychic|widthfull}}|{{Shuffle Stage| stage 得分挑战关卡| name 超梦| number 150| for…

SpringBoot操作hbase

1&#xff0c;添加依赖&#xff08;客户端版本和 HBase 版本需要保持一致&#xff0c;否则可能会遇到不兼容的问题。&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>&…

php 域名白名单,域名白名单验证

验证域名是否在白名单中是编程时常用到的功能&#xff0c;对安全性有要求的项目中都有该功能。常见的使用场景有登录后回跳&#xff0c;跳转到外站时弹出安全提示等。知乎登录后回跳&#xff1b;只要有登录的地方就需要用到来源回跳。我们在一个页面www.baidu.com 调用知乎的登…

Java Socket与Html5 websocket通信

一、Mysocket.java文件 import org.springframework.stereotype.Component;import javax.websocket.*; import javax.websocket.server.*;// ws://localhost:8080/ws/Tom ServerEndpoint("/ws/{user}") Component public class MySocket {private String currentUse…

matlab 由移相角如何产生移相脉冲,整流电路控制角移相范围是怎么确定的?

整流电路控制角移相范围是怎么确定的&#xff1f;2019-03-14【FrancisQu的回答(28票)】:谢邀^^一言以蔽之&#xff0c;整流电路控制角的范围取决于整流电路直流输出电压平均值时所得的控制角&#xff0c;详细分析如下。基本概念&#xff1a;触发延迟角(控制角)——从晶闸管开始…

php编程对联,形容程序员的对联大全

程序员&#xff0c;是从事程序开发、维护的专业人员。现在有一些形容程序员的对联&#xff0c;学习啦小编为大家整理了一些&#xff0c;感兴趣的&#xff0c;欢迎大家阅读。形容程序员的对联摘抄上联&#xff1a;莫道运维无姝丽&#xff0c;下联&#xff1a;谁言开发不风情?横…

SpringBoot 实现SSE 服务器发送事件

SSE 全称Server Sent Event&#xff0c;直译一下就是服务器发送事件&#xff0c;一般的项目开发中&#xff0c;用到的机会不多&#xff0c;可能很多小伙伴不太清楚这个东西&#xff0c;到底是干啥的&#xff0c;有啥用 本文主要知识点如下&#xff1a; SSE 扫盲&#xff0c;应…