日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java反射jdk1.8,Java基础----jdk1.8 反射实验

發(fā)布時(shí)間:2025/3/12 java 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java反射jdk1.8,Java基础----jdk1.8 反射实验 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。