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

java反射jdk1.8,Java基础----jdk1.8 反射实验相关推荐

  1. Java学习之路1——安装JDK1.8||安装idea2022||Java项目创建【重拾Java】

    Java学习之路1--安装JDK1.8||安装idea2022[重拾Java] 前言 安装 安装JDK1.8 安装idea2022(JetBrains Toolbox) Java项目创建 创建 项目结 ...

  2. Java学习笔记整理-知识梳理+JDK1.8详细文档

    链接:java开发手册 提取码:kes8 链接:JDK1.8详细文档 提取码:n9zo JavaSE 面向对象编程(Object-oriented programming) 封装 类(class) 类 ...

  3. java基础- 注解和反射

    1. 注解(Annotation) 1. 什么是注解 Annotation是从JDK5.0开始引入的新技术. Annotation的作用 : 不是程序本身,可以对程序作出解释.(这一点和注释(comm ...

  4. JAVA基础,注解反射机制

    文章目录 注解 (非常重要) 什么是注解 基本注解 @Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface ...

  5. Java基础-注解和反射

    Java基础-注解和反射 前言 对于注解,我主要还是在自定义APT还有运行时反射获取类来让自己能够构建出复用性更高的代码逻辑. 知识点1-注解: 注解的应用场景由元注解@Retention来进行指定, ...

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

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

  7. JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载

    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载 JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet ...

  8. linux 卸载java jdk1.6_Linux/CentOS 卸载系统原装jdk1.4 和安装jdk1.6.1

    1.卸载系统自带jdk 在终端中输入 yum -y remove java java-1.4.2-gcj-compat 2.安装新版本jdk 2.1环境变量配置 vi /etc/profile 在 e ...

  9. Java基础10(反射)

    Java基础10(反射) 1 什么是反射 官方解释:反射(reflection)技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现.它是一个相对而言比较高级的技术,反射是一种强有力的技术 ...

最新文章

  1. Numpy 数组复合排序——mX4列,根据多列组合排序
  2. 全面解析虚拟内存概念
  3. PHP_MySQL笔试题目一
  4. 代码 抠图_3 行 Python 代码 5 秒抠图的 AI 神器,根本无需 PS
  5. 作者:叶郁文,男,中兴通讯股份有限公司产品规划部长。
  6. 一组经典测试思想观点
  7. OpenCV-Python实战(番外篇)——OpenCV、NumPy和Matplotlib直方图比较
  8. vue.js--基础 数据的双向绑定
  9. axure如何导出原件_彻底抛弃WORD!教你用Axure快速输出高质量的PRD
  10. 你有在为大学时选的专业后悔吗?
  11. java出名的外国文献_三大牛人看外国文献的方法(搜索无重复) - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  12. 11个能够帮助Java开发者提升编程能力的Java论坛汇总
  13. PIC16 F887 单片机 直流电机PWM调速 PID调速 PID算法
  14. UML系列——时序图(顺序图)
  15. 在linux系统上查看本机ip地址
  16. 小白成长之路-linux定时任务cron和crontab
  17. 在dick字典里找最大值并返回key的办法
  18. 微软亚洲研究院开发的对对联软件
  19. JAVA面试题100道一
  20. python抓取搜狗微信公众号文章

热门文章

  1. aes-128算法加密_加密算法问题-人工智能中的一种约束满意问题
  2. r语言简介_R语言简介
  3. enter sleep mode黑屏怎么解决_【linux】 不要再暴力关机了,讲讲我最近遇到的问题和完美解决方案...
  4. python怎么变各种颜色_python – 如何淡化颜色
  5. covariance matrix r语言_时间序列分析|ARIMAX模型分步骤详解和R中实践
  6. macos可以升级到指定版本吗_承装承修承试可以跨级升级吗?
  7. ruby循环_Ruby循环
  8. python 散点图 分类_Python | 分类图
  9. vc++中画线时xor_C ++'xor_eq'关键字和示例
  10. java range类_Java即时类| range()方法与示例