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

引言:  最近做到的项目中,需要给对接方提供一个公共接口,根据对方传入的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. python 基本数据类型set

    set 是一个无序且不重复的序列 set 是一个无序且不重复的序列 set 不允许重复的集合.set不允许重复的序列 1.创建 s=set() #创建空集合只能用这种方法 s={11,222,233, ...

  2. .Net Core中使用ref和Span<T>提高程序性能

    一.前言 其实说到ref,很多同学对它已经有所了解,ref是C# 7.0的一个语言特性,它为开发人员提供了返回本地变量引用和值引用的机制. Span也是建立在ref语法基础上的一个复杂的数据类型,在文 ...

  3. sublime比较好用的插件

    emmet, markdown preview, package Control, SFTP, Anaconda

  4. php微信支付问题之 cURL error 60: SSL certificate: unable to get local issuer certificate

    cacert.pem(点击下载) 解决办法:比如我本地安装的是wamp,将cacert.pem文件放在这个文件夹下面D:\wamp\bin\php\php5.5.12\ext 如果安装的phpStud ...

  5. kafka 自定义分区器

    package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.Partitioner; import org.a ...

  6. canvas——路径搜索

    在前一篇博客中随机生成迷宫,现在就以随机生成的迷宫为地图,开始寻找路径. 迷宫寻路也可以使用DFS,BFS,但常见的是A*算法,它是启发式搜索算法的一种,效率相比前两者也更高.接下来以A*算法为例,迷 ...

  7. Asp.Net Core-----简介与安装

    Asp.Net Core简介 ASP.NET Core 是一个全新的开源.跨平台框架,可以用它来构建基于网络连接的现代云应用程序,比如:Web 应用,IoT(Internet Of Things,物联 ...

  8. OpenSSL "heartbleed" 安全漏洞

    在 heartbleed 的官网上有关于 CVE-2014-0160 漏洞的详细信息,这是关于 OpenSSL 的信息泄漏漏洞导致的安全问题.改 Heartbleed bug 可以让互联网的任何人读取 ...

  9. JavaScript实现图片拖拽、粘贴上传

    前些日子为老婆做了一个web管理商品的工具,因为商品的图片比较多并且还需要剪裁图,为了上传图片方便加了一个拖拽.粘贴上传的功能. 我已经把代码整理出来放到GitHub上了,有兴趣的朋友可以下来玩玩. ...

  10. MVC 5限制所有HTTP请求必须是POST

    今天有位同事,提出了这样一个问题,他想限制所有MVC接收到的HTTP请求必须是POST方式. 接下来在下面的内容中,将我想到的方式分享给大家,如果大家有其它的方式,请留言. 一.HttpPostAtt ...