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

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

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

使用if-else模式缺点:

  1. 看着蠢
  2. 不易阅读(个人观点)
  3. 不易维护
  4. balabala...不想编了,就是看着不爽

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

 public class TestMethod {

     public Object dispatchMethod(String name, String data) {
Object obj = null; if ("methodA".equal(name)) {
obj = methodA(data);
} else if ("methodB".equal(name)) {
obj = methodB(data);
} else if (...) {
...
}
return obj;
} private Object methodA(String data) {
...
} private Object methodB(String data) {
...
} ...
}

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

开发环境:jdk1.8

实现代码:

  • 定义目标方法枚举,包含rootelement信息,调用方法说明,目标方法targetName
 public enum MethodEnum {

     METHODA("MethodA","调用方法A","methodA"),
METHODB("MethodB","调用方法B","methodB"),
; @Getter
private String code; //rootelement @Getter
private String message; @Getter
private String name; //目标方法名 private MethodEnum (String code,String message,String name) {
this.code = code;
this.message = message;
this.name = name;
} public static MethodEnum fromCode(String code) { //根据传入code,筛选目标方法
for (DockingFliggyHotelEnum p : DockingFliggyHotelEnum.values()) {
if(p.code.equalsIgnoreCase(code)) {
return p;
}
}
return null;
}
}
  • 定义反射方法工具类
 /**
* 定义工具类
**/
public class MethodUtil { public static Method getTargetMethod(Class clazz, String methodName) {
Method[] methods = clazz.getDeclaredMethods(); //获取所有方法,包含private
if (methods != null && methods.length > 0) {
String regEx = "^" + methodName +"$";//获取所要查找到的方法名称要匹配此正则
Pattern pattern = Pattern.compile(regEx);
for (Method method : methods) {
Matcher matcher = pattern.matcher(method.getName());
boolean rs = matcher.find();
if(rs){
return method;
}
}
}
return null;
} public static Object executeTargrtMethod(Class clazz, String methodName, String xmlData) {
Object obj = null;
try {
Method method = getTargetMethod(clazz, methodName);
obj = method.invoke(clazz, xmlData);
} catch (Exception e) { }
return obj;
} }
  • 具体分发
 public class TestDispatch {

     public Object dispatch(String root, String xml) {
String name = MethodEnum.fromCode(root).name;
Object obj = executeTargrtMethod(this.getClass(), name, xml)
return obj;
} private Object methodA(String xml) {
Object obj = null;
...
return obj;
} private Object methodB(String xml) {
Object obj = null;
...
return obj;
} ...
}

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

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

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

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

    /**
* @param batchCount 一次批量插入数据量
* @param target 目标方法关键字
* @param list 需要插入的大批量数据
* @throws Exception
*/
public static void batchInsert(Class clazz, int batchCount, String target, List<?> list) throws Exception{
Method method = getTargetMethod(target);
int batchLastIndex = batchCount - 1;//每批最后一个的下标
for(int index = 0; index < list.size()-1;){
if(batchLastIndex > list.size()-1){
batchLastIndex = list.size() - 1;
if (method != null) {
method.invoke(clazz,list.subList(index, batchLastIndex));
}
break;//数据插入完毕,退出循环
}else{
if (method != null) {
method.invoke(clazz,list.subList(index, batchLastIndex));
}
index = batchLastIndex + 1;//设置下一批下标
batchLastIndex = index + (batchCount - 1);
}
}
}

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

写在最后

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

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

Java基础----jdk1.8 反射实验的更多相关文章

  1. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  2. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  3. Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...

  4. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  5. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  6. Java基础学习(1)——反射

    反射就是把Java类中的各种成分映射成相应的Java类(主要用于框架开发) 反射的基石–>Class类 Java程序中的各个类属于同一事物,描述这类事务的Java类名就是Class. Class ...

  7. 大数据JavaWeb之java基础巩固----Junit&反射&注解

    最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...

  8. Java基础13:反射详解

    本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...

  9. Java基础教程(26)--反射

    一.类   对于每一种类型的对象,Java虚拟机都会实例化一个java.lang.Class类的不可变实例.该实例提供了获取对象的运行时属性的方法,包括它的成员和类型信息.Class类还提供了创建新实 ...

随机推荐

  1. 主机通过host-only虚拟网卡连接VBOX虚拟机

    主机通过host-only虚拟网卡连接VBOX虚拟机 How to set up host-only virtual machines that host can access it... 问题 因为 ...

  2. CNPM 遇到use strict的问题

    一.问题描述 [root@VM_123_144_centos node01]# cnpm install --save nodemailer /usr/lib/node_modules/cnpm/no ...

  3. Segmentation Faul

    转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html

  4. find命令之xargs,exec

    一,find命令之xargs: 在 使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命 令长度有限制,这样 ...

  5. Asynchronous and Distributed Programming in R with the Future Package

    Every now and again someone comes along and writes an R package that I consider to be a 'game change ...

  6. 构建自己的PHP框架--构建模版引擎(2)

    自从来到新公司就一直很忙,最近这段时间终于稍微闲了一点,赶紧接着写这个系列,感觉再不写就烂尾了. 之前我们说到,拿到{{ $name }}这样一段内容时,我们只需要将它转化成<?php echo ...

  7. awk内引用shell变量【自己手动加精】

    题目 [root@localhost ~]# cat 1.txt iii sss ddd 执行命令 [root@localhost ~]# A=0 [root@localhost ~]# awk '{ ...

  8. 高CPU、数据库无法读写的真凶

    有兴趣的同学可以参考如下系列文章,都是针对dump分析的实战和总结: Windbg DUMP分析(原创汇总) http://www.cnblogs.com/LoveOfPrince/p/6653341 ...

  9. scrapy调试时出现 ImportError: No module named win32api

    windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...

  10. Step by Step 用Azure Automation 来开虚机(ARM)

    使用Azure Automation来自动化处理各种重复的耗时的云管理任务从而帮助云运维人员提升效率,帮助降低运营成本. 具体相关的介绍以及怎样利用Azure Automation来完成定期开关虚拟机 ...