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