在java中由類名和方法名字符串實(shí)現(xiàn)其調(diào)用方式
js里通過eval()函數(shù),在知道某個(gè)方法名是可以實(shí)現(xiàn)調(diào)用該方法,那么在java里邊又怎么實(shí)現(xiàn)的呢?
java里邊是通過反射機(jī)制來實(shí)現(xiàn),代碼如下:
import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws Exception { String className = "com.runqianapp.ngr.alias.example.FunClass"; String methodName = "sayHello"; Class clz = Class.forName(className); // Object obj = clz.newInstance(); //獲取方法 Method m = obj.getClass().getDeclaredMethod(methodName, String.class); //調(diào)用方法 String result = (String) m.invoke(obj, "aaaaa"); System.out.println(result); } } class FunClass{ public String sayHello(String s){ System.out.println(s); return "hello!"; } }
補(bǔ)充知識(shí):一個(gè)controller調(diào)用根據(jù)不同業(yè)務(wù)分發(fā)不同service
在一個(gè)項(xiàng)目中需要寫很多的controller去調(diào)用不同的service,而寫一個(gè)網(wǎng)關(guān)可以省去寫controller層的痛苦。
下面開始介紹可以分發(fā)不同service。
1.因?yàn)閟ervice在項(xiàng)目啟動(dòng)時(shí)就已全部注入到spring容器中,所以我們需要寫一個(gè)工具類,可以從spring上下文(applicationContext)中獲取到對(duì)應(yīng)service
@Component public class SpringUtil implements ApplicationContextAware { @Autowired private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (SpringUtil.applicationContext == null) { SpringUtil.applicationContext = applicationContext; } System.out.println("========ApplicationContext配置成功,在普通類可以通過調(diào)用SpringUtil.getAppContext()獲取applicationContext對(duì)象,applicationContext=" + SpringUtil.applicationContext + "========"); } //獲取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通過name獲取 Bean. public static Object getBean(String name) { return getApplicationContext().getBean(name); } //通過class獲取Bean. public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } //通過name,以及Clazz返回指定的Bean public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
2.上面的SpringUtil我們已經(jīng)可以在上下文中直接取到對(duì)于的service了,下面就開始編寫controller進(jìn)行請(qǐng)求的分發(fā)(我稱之為網(wǎng)關(guān))。首先我們需要先寫一個(gè)抽象類,來定義service,這樣接下來的sevice只需要繼承這個(gè)抽象類即可(我們還可以寫一些時(shí)間統(tǒng)計(jì),交易流水入庫等。。自我感覺很大的用處)。
public abstract class RootService { private Logger logger = LoggerFactory.getLogger(RootService.class); private long beforeTime; private long endTime; private void before (String action) { beforeTime = System.currentTimeMillis(); logger.info("交易:" + action + "開始時(shí)間:" + beforeTime); } private void end (String action) { endTime = System.currentTimeMillis(); long time = endTime - beforeTime; logger.info("交易:" + action + "結(jié)束時(shí)間:" + endTime); logger.info("交易:" + action + "耗時(shí):" + time); } public JSONObject execute(String actionName,Map map) { before(actionName); JSONObject jsonObject = doNext(map); end(actionName); return jsonObject; } private JSONObject doNext(Map map) { try { return doAction(map); } catch (Exception e) { e.printStackTrace(); JSONObject js = new JSONObject(); js.put("retCode","000000"); js.put("retMsg","程序報(bào)錯(cuò)"); return js; } } protected abstract JSONObject doAction(Map map); }
3.一切準(zhǔn)備就緒,我們可以開始編寫contrconoller了(網(wǎng)關(guān))
@Controller @RequestMapping("/root") public class RootController { @ResponseBody @RequestMapping(value = "/h5.do",produces = {"application/json;charset=UTF-8"},method = RequestMethod.POST) public JSONObject root(@RequestBody Map<String,Object> map, HttpServletRequest httpServletRequest){ String service = (String) map.get("service"); JSONObject js = new JSONObject(); RootService rootService = (RootService) SpringUtil.getBean(service); return rootService.execute(service,map); } }
到這里一個(gè)網(wǎng)關(guān)就寫好了,然后我們寫一個(gè)service進(jìn)行測(cè)試一下(對(duì)應(yīng)的Dao層我就不現(xiàn)丑了,相信大家都會(huì))
@Service public class UserServiceImpl extends RootService{ private Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired private UserDao userDao; @Override protected JSONObject doAction(Map map) { JSONObject js = new JSONObject(); String id = (String) map.get("id"); User user = userDao.getUser(id); js.put("user",user); logger.info("進(jìn)入了UserService"); return js; } }
下面我們用postman測(cè)試一下測(cè)試報(bào)文為:
{ "id":"1", "service":"userServiceImpl" }
控制臺(tái)打印為:
2019-10-18 17:24:41.089 INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService : 交易:userService開始時(shí)間:1571390681089
2019-10-18 17:24:41.138 INFO 6452 --- [nio-8080-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2019-10-18 17:24:41.227 INFO 6452 --- [nio-8080-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2019-10-18 17:24:41.255 INFO 6452 --- [nio-8080-exec-2] c.s.s.service.impl.UserService : 進(jìn)入了UserService
2019-10-18 17:24:41.256 INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService : 交易:userService結(jié)束時(shí)間:1571390681256
2019-10-18 17:24:41.256 INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService : 交易:userService耗時(shí):167
返回為:
{ "user": { "user_id": "1", "password": "123456", "user_name": "張三" } }
總結(jié):這樣寫法的好處在于 1.有一個(gè)統(tǒng)一的入口,不需要在編寫controller, 可以專注于業(yè)務(wù)(service)2.可以在公共入口做公共處理。
以上這篇在java中由類名和方法名字符串實(shí)現(xiàn)其調(diào)用方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java數(shù)據(jù)結(jié)構(gòu)之二分查找法 binarySearch的實(shí)例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)之二分查找法 binarySearch的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10Java中l(wèi)ist.foreach()和list.stream().foreach()用法詳解
在Java中List是一種常用的集合類,用于存儲(chǔ)一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下2024-07-07Java實(shí)現(xiàn)大文件的分片上傳與下載(springboot+vue3)
這篇文章主要為大家詳細(xì)介紹了java基于springboot+vue3如何大文件的分片上傳與下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-06-06IDEA?database和datagrip無法下載驅(qū)動(dòng)問題解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA?database和datagrip無法下載驅(qū)動(dòng)問題的解決辦法,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用idea具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-03-03Springboot整合Dubbo教程之項(xiàng)目創(chuàng)建和環(huán)境搭建
本篇文章主要介紹了Springboot整合Dubbo教程之項(xiàng)目創(chuàng)建和環(huán)境搭建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12java實(shí)現(xiàn)word文檔轉(zhuǎn)pdf并添加水印的方法詳解
這篇文章主要介紹了java實(shí)現(xiàn)word文檔轉(zhuǎn)pdf并添加水印的方法,結(jié)合實(shí)例形式詳細(xì)分析了java word文檔轉(zhuǎn)PDF相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-09-09SpringBoot+Vue中的Token續(xù)簽機(jī)制
本文主要介紹了SpringBoot+Vue中的Token續(xù)簽機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06