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

引言:  最近做到的项目中,需要给对接方提供一个公共接口,根据对方传入的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. Day1-用户输入及字符串格式化输入

    1.用户输入--input和getpass函数 2.字符串的格式化 ############################################# 一.用户输入--input()函数 #! ...

  2. SpringBoot系列(一)RestTemplate

    作为springBoot的开篇系列,RestTemplate只能表示我只是个意外 what RestTemplate是spring提供的用于访问rest服务的客户端(其实类似Apache的HttpCl ...

  3. mysql5.6创建新用户并给授权指定的数据库权限

    一.环境: CentOS 6.8 mysql 5.6 二.背景 给外包的工作人员提供我司某台服务器的 mysql 中某个数据库的访问权限. 之所以要做限制,是防止他们对我司其他的数据库非法进行操作. ...

  4. 多线程编程-- part 5.3 LockSupport

    一.LockSupport的介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语.  LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程 ...

  5. Nagios配置安装详解

    nagios.html :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);borde ...

  6. characterEncodingFilter作用

    package com.demo.test; import java.io.IOException; import javax.servlet.Filter; import javax.servlet ...

  7. Selenium WebDriver + python 自动化测试框架

    目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤.检查点,然后执行自动化工程,即可执行功能自动化测试用例 ...

  8. 逻辑卷管理lvm

    逻辑卷管理LVM 一 创建逻辑卷 1准备分区或硬盘 这里使用/dev/sdb./dev/sdc两块硬盘和/dev/sda9./dev/sda10两个分区,大小都为1G,磁盘有限,我也不想这么抠的. 添 ...

  9. 玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)

    前言: nodejs提供了cluster集群(支持端口共享的多进程),cluster基于child_process,process二次封装,方便我们使用该功能实现单机nodejs的web集群. 1.c ...

  10. JavaBean在jsp中的使用

    JavaBean在Jsp中的引用: 1.用<jsp:useBean>标记: <jsp:useBean id="name" class="classnam ...