Java基础----jdk1.8 反射实验
(写在最前:还没入门的搬砖工的一本正经的胡说八道)
引言: 最近做到的项目中,需要给对接方提供一个公共接口,根据对方传入的XML文件的rootelement分发调用接口,最简单的使用if-else if 模式,但是看着实在太蠢。
场景一:需要根据关键字,进行接口分发
使用if-else模式缺点:
- 看着蠢
- 不易阅读(个人观点)
- 不易维护
- 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 反射实验的更多相关文章
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
- 学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- Java基础学习(1)——反射
反射就是把Java类中的各种成分映射成相应的Java类(主要用于框架开发) 反射的基石–>Class类 Java程序中的各个类属于同一事物,描述这类事务的Java类名就是Class. Class ...
- 大数据JavaWeb之java基础巩固----Junit&反射&注解
最近打算从0开始学学大数据,目前的主业是Android开发,但是当年毕业之后其实是搞J2EE的,所以打算没事又来拓展一下后台的技能,扩宽一下自己的知识体系对于自己的未来也能够多一些可能,另外大数据的一 ...
- Java基础13:反射详解
本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...
- Java基础教程(26)--反射
一.类 对于每一种类型的对象,Java虚拟机都会实例化一个java.lang.Class类的不可变实例.该实例提供了获取对象的运行时属性的方法,包括它的成员和类型信息.Class类还提供了创建新实 ...
随机推荐
- Day1-用户输入及字符串格式化输入
1.用户输入--input和getpass函数 2.字符串的格式化 ############################################# 一.用户输入--input()函数 #! ...
- SpringBoot系列(一)RestTemplate
作为springBoot的开篇系列,RestTemplate只能表示我只是个意外 what RestTemplate是spring提供的用于访问rest服务的客户端(其实类似Apache的HttpCl ...
- mysql5.6创建新用户并给授权指定的数据库权限
一.环境: CentOS 6.8 mysql 5.6 二.背景 给外包的工作人员提供我司某台服务器的 mysql 中某个数据库的访问权限. 之所以要做限制,是防止他们对我司其他的数据库非法进行操作. ...
- 多线程编程-- part 5.3 LockSupport
一.LockSupport的介绍 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程 ...
- Nagios配置安装详解
nagios.html :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);borde ...
- characterEncodingFilter作用
package com.demo.test; import java.io.IOException; import javax.servlet.Filter; import javax.servlet ...
- Selenium WebDriver + python 自动化测试框架
目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤.检查点,然后执行自动化工程,即可执行功能自动化测试用例 ...
- 逻辑卷管理lvm
逻辑卷管理LVM 一 创建逻辑卷 1准备分区或硬盘 这里使用/dev/sdb./dev/sdc两块硬盘和/dev/sda9./dev/sda10两个分区,大小都为1G,磁盘有限,我也不想这么抠的. 添 ...
- 玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)
前言: nodejs提供了cluster集群(支持端口共享的多进程),cluster基于child_process,process二次封装,方便我们使用该功能实现单机nodejs的web集群. 1.c ...
- JavaBean在jsp中的使用
JavaBean在Jsp中的引用: 1.用<jsp:useBean>标记: <jsp:useBean id="name" class="classnam ...