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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java反射————Method根据方法名称字符串调用方法

發布時間:2025/3/12 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java反射————Method根据方法名称字符串调用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

之前瀏覽廖雪峰老師的個人博客網站,無意間發現了關于在Java8中獲取參數的方法,隨手一轉《Java 8中獲取參數名稱》,沒想到今天遇到一個功能,非常符合這種反射調用的使用場景。回看了這篇之前轉載的文章,然后根據自己的理解完成了這個功能。

場景描述

功能其實并不復雜。一個設備表中有兩個字段,A和B,希望既可以通過A來查找相應記錄,又能夠通過B來查找相應記錄,但問題就在于A和B的樣子非常相似,不僅類型相同,就連名字也幾乎完全一樣(lntDeviceType和ytDeviceType)。

我在Repository中定義了兩個方法,分別區分開不同設備類型的查詢:

public DeviceType findByYtDeviceType(String ytDeviceType); public DeviceType findByLntDeviceType(String lntDeviceType);

可是如何在Service中區分應該調用哪個方法呢?第一個能想到的方法就是寫死,通過一個值來區分是根據A字段來查詢還是B字段來查詢,像如下這種形式:

public DeviceType findDeviceType(String column, String deviceTypeStr) {if(column.equals("yt")) {return findByYtDeviceType(deviceTypeStr);} else if (column.equals("lnt")) {return findByLntDeviceType(deviceTypeStr);} else {return null;} }

上述代碼,通過一個colum字符串來得知究竟是通過ytDeviceType字段來查詢,還是通過lntDeviceType來查詢。問題可以得到解決,但是如果增加了一個C字段怎么辦?又增加了一個D字段呢?難道每加一個字段都要加一個else if 寫死一個分支?

解決辦法——反射調用

思考過后,我想到了通過反射的方式來實現這個功能:

public DeviceType findByDeviceType(String deviceTypeTitle, String deviceType) {// 校驗deviceTypeTitle是否正確try {Set<String> deviceTypeColumSet = mapper.convertValue(new DeviceType(), Map.class).keySet();if (!deviceTypeColumSet.contains(deviceTypeTitle))return null;String findBy = "findBy";// 根據deviceTypeTitle查找對應方法名并調用方法Method findByXxDeviceType = dtRepo.getClass().getMethod(findBy + StringUtils.capitalize(deviceTypeTitle),String.class);DeviceType deviceTypeBean = (DeviceType) findByXxDeviceType.invoke(dtRepo, deviceType);logger.info("按類型查找設備類型deviceTypeTitle = " + deviceTypeTitle + "; deviceType = " + deviceType);return deviceTypeBean;} catch (Exception e) {e.printStackTrace();}return null; }

(說明:try塊的前三行代碼主要是驗證deviceTypeTitle是否在DeviceType類型的屬性之列,比如DeviceType有A、B兩個屬性,那么如果deviceTypeTitle是A或者B就符合要求,如果是C就不可以了。StringUtils.capitalize方法主要是將deviceTypeTitle的首字母變為大寫,然后加上前綴 “findBy” 從而得到Repository中的方法名)

因為不論是用哪個字段來查詢,其方法名始終都是? “findByXxxx” ,那何不通過映射自動匹配到對應的方法然后調用呢?這個時候我突然回想起了之前轉載的廖雪峰老師的博客《Java 8中獲取參數名稱》,簡單回看之后果然可以解決我的問題,再進一步搜索相關資料之后完成了上述代碼。

可以看到我通過拼接一個“findBy”前綴,然后將傳入的 deviceTypeTitle 首字母大寫與前綴拼接后即可得到Repository中對應的方法名,然后我通過方法名即可進行調用,完全不需要擔心未來擴展的問題。即便未來擴展新的設備類型字段,而只需要在Repository中按照 “findByXxxx” 命名規則新加一個查詢即可,service中的分發請求完全不需要改動,豈不美哉?!

綜上,就是關于通過方法名稱字符串映射調用方法的例子,希望能夠對大家有所幫助,歡迎文末留言。

總結

以上是生活随笔為你收集整理的Java反射————Method根据方法名称字符串调用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲av成人精品午夜一区二区 | 国产剧情一区二区三区 | 色丁香六月 | 日日艹夜夜艹 | 中文字幕人妻丝袜二区 | 亚洲在线免费观看 | 97精品人妻一区二区三区蜜桃 | 性一交一黄一片 | 91资源在线视频 | 在线免费av网 | 国产成人自拍网 | 天天爱天天操 | 日产精品一区二区 | 99久久久久 | 欧洲av在线| 性v天堂 | 成人h视频在线 | 99视频网址 | 免费午夜人成电影 | www.色婷婷.com| 国产精品一区二 | 古代黄色一级片 | 日韩精品中文字幕一区 | 校花被c到呻吟求饶 | 91丨九色丨蝌蚪丨丝袜 | 国产一区二区视频在线播放 | 二区三区av| 久久国产精品一区二区三区 | 亚洲va国产天堂va久久 en | 污版视频在线观看 | xxxx日本黄色 | 中文字幕18页 | av网站免费大全 | 一本久久综合亚洲鲁鲁五月天 | 日本精品一区视频 | 依人成人| 日日噜噜噜夜夜爽爽狠狠视频97 | 影音先锋欧美资源 | 日韩精品极品视频在线观看免费 | 亚洲av无码片一区二区三区 | 中文字幕亚洲欧美日韩在线不卡 | 日本japanese乳偷乱熟 | 中文字幕一二三区 | 久久高清毛片 | 人人澡人人澡人人澡 | 国产女人18毛片18精品 | 少妇专区| 大毛片| 美女日批在线观看 | 日韩av免费在线观看 | 全黄一级男人和女人 | 人人爽人人澡 | 伊人久久爱 | 69视频网站 | 国产亚洲精品一区二区三区 | 欧美熟妇精品黑人巨大一二三区 | 国产女主播在线 | yy4138理论片动漫理论片 | 亚洲欧美日韩动漫 | 免费精品视频 | 精品人妻一区二区三区日产乱码 | 最近中文字幕在线观看视频 | 久久久香蕉视频 | 日韩av网址大全 | 老司机在线永久免费观看 | 麻豆tube | 精品一区二区欧美 | 中文字幕一区二区三区门四区五区 | 国产男男网站 | 男人午夜网站 | 黑森林av | 国产成人精品一区二区三区网站观看 | 国产乱子伦农村叉叉叉 | 国产ts变态重口人妖hd | 成人美女免费网站视频 | 男人的天堂久久 | 国产美女精品久久 | 另类性姿势bbwbbw | 一本久久a精品一合区久久久 | eeuss日韩| 一区二区在线看 | 二区三区偷拍浴室洗澡视频 | 丝袜黄色片 | 一区二区三区四区精品视频 | 国产精品一级视频 | 精品欧美一区二区三区在线观看 | 91操操| 久久艹影院 | 日韩精品免费观看 | 在线观看欧美一区二区三区 | 免费在线视频观看 | 阿v天堂2014| 自拍偷拍欧美亚洲 | 精产国品一区二区 | 精品久久免费观看 | 成人a视频在线观看 | 亚洲毛片在线 | 午夜激情啪啪 | 国产三级在线免费观看 |