java反射jdk1.8,Java基础----jdk1.8 反射实验
Java基礎(chǔ)----jdk1.8 反射實(shí)驗(yàn)
(寫(xiě)在最前:還沒(méi)入門(mén)的搬磚工的一本正經(jīng)的胡說(shuō)八道)
引言:? 最近做到的項(xiàng)目中,需要給對(duì)接方提供一個(gè)公共接口,根據(jù)對(duì)方傳入的 XML 文件的 rootelement 分發(fā)調(diào)用接口,最簡(jiǎn)單的使用 if-else if 模式,但是看著實(shí)在太蠢。
場(chǎng)景一:需要根據(jù)關(guān)鍵字,進(jìn)行接口分發(fā)
使用 if-else 模式缺點(diǎn):看著蠢
不易閱讀(個(gè)人觀點(diǎn))
不易維護(hù)
balabala... 不想編了,就是看著不爽
如果只有一兩個(gè)方法還好,如果方法多了,額。。。如下,自行體會(huì)。
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}
那么步入正題,我才用的反射模式,匹配目標(biāo)方法,我認(rèn)為可以降低維護(hù)和閱讀成本
開(kāi)發(fā)環(huán)境:jdk1.8
實(shí)現(xiàn)代碼:定義目標(biāo)方法枚舉,包含 rootelement 信息,調(diào)用方法說(shuō)明,目標(biāo)方法 targetName
1publicenumMethodEnum{
2
3METHODA("MethodA","調(diào)用方法A","methodA"),
4METHODB("MethodB","調(diào)用方法B","methodB"),
5;
6
7@Getter
8privateStringcode;//rootelement
9
10@Getter
11privateStringmessage;
12
13@Getter
14privateString name;//目標(biāo)方法名
15
16privateMethodEnum(Stringcode,Stringmessage,Stringname){
17this.code=code;
18this.message=message;
19this.name=name;
20}
21
22publicstaticMethodEnum fromCode(Stringcode){//根據(jù)傳入code,篩選目標(biāo)方法
23for(DockingFliggyHotelEnump:DockingFliggyHotelEnum.values()){
24if(p.code.equalsIgnoreCase(code)){
25returnp;
26}
27}
28returnnull;
29}
32}定義反射方法工具類(lèi)
1
/**
2 * 定義工具類(lèi)
3 **/
4publicclassMethodUtil{
56publicstaticMethodgetTargetMethod(Classclazz,StringmethodName){
7Method[]methods=clazz.getDeclaredMethods();//獲取所有方法,包含private
8
if(methods!=null&&methods.length>0){
9StringregEx="^"+methodName+"$";//獲取所要查找到的方法名稱(chēng)要匹配此正則
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
}具體分發(fā)
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}
對(duì)于業(yè)務(wù)代碼結(jié)構(gòu)清晰明了,是不是看著爽多了。
對(duì)于類(lèi)似的場(chǎng)景很多,都可以使用反射機(jī)制。
場(chǎng)景二:項(xiàng)目中多處需要大批量插入數(shù)據(jù),提取一個(gè)公共方法,減少代碼行數(shù),何樂(lè)而不為呢?
對(duì)了,順便說(shuō)一下這個(gè)批量插入方法,數(shù)據(jù)庫(kù)使用 mysql,項(xiàng)目框架 springboot,jdk1.8,5000 條數(shù)據(jù)插入一次,耗時(shí) 0.8s 左右。
1
/**
2 * @param batchCount 一次批量插入數(shù)據(jù)量
3 * @param target 目標(biāo)方法關(guān)鍵字
4 * @param list 需要插入的大批量數(shù)據(jù)
5 * @throws Exception
6 */
7publicstaticvoidbatchInsert(Classclazz,intbatchCount,Stringtarget,Listlist)throwsException{
8Methodmethod=getTargetMethod(target);
9intbatchLastIndex=batchCount-1;//每批最后一個(gè)的下標(biāo)
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;//數(shù)據(jù)插入完畢,退出循環(huán)
17
}else{
18
if(method!=null){
19method.invoke(clazz,list.subList(index,batchLastIndex));
20
}
21index=batchLastIndex+1;//設(shè)置下一批下標(biāo)
22batchLastIndex=index+(batchCount-1);
23
}
24
}
25
}
實(shí)驗(yàn)結(jié)束,代碼分析下次在寫(xiě)了。
寫(xiě)在最后
代碼是偽代碼,可能啥地方寫(xiě)得不對(duì),歡迎指正
對(duì)于以上兩種場(chǎng)景,我目前只能想到這種方法。。。如果你有更好的,歡迎來(lái)懟我
來(lái)源: http://www.cnblogs.com/frances9416/p/7119216.html
總結(jié)
以上是生活随笔為你收集整理的java反射jdk1.8,Java基础----jdk1.8 反射实验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 香帅的北大金融学课笔记11 -- 资产配
- 下一篇: 香帅的北大金融学课笔记19 -- 科技金