最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在java中由類名和方法名字符串實現(xiàn)其調(diào)用方式

 更新時間:2020年09月24日 11:04:30   作者:龍昊雪  
這篇文章主要介紹了在java中由類名和方法名字符串實現(xiàn)其調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

js里通過eval()函數(shù),在知道某個方法名是可以實現(xiàn)調(diào)用該方法,那么在java里邊又怎么實現(xiàn)的呢?

java里邊是通過反射機(jī)制來實現(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ǔ)充知識:一個controller調(diào)用根據(jù)不同業(yè)務(wù)分發(fā)不同service

在一個項目中需要寫很多的controller去調(diào)用不同的service,而寫一個網(wǎng)關(guān)可以省去寫controller層的痛苦。

下面開始介紹可以分發(fā)不同service。

1.因為service在項目啟動時就已全部注入到spring容器中,所以我們需要寫一個工具類,可以從spring上下文(applicationContext)中獲取到對應(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對象,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)可以在上下文中直接取到對于的service了,下面就開始編寫controller進(jìn)行請求的分發(fā)(我稱之為網(wǎng)關(guān))。首先我們需要先寫一個抽象類,來定義service,這樣接下來的sevice只需要繼承這個抽象類即可(我們還可以寫一些時間統(tǒng)計,交易流水入庫等。。自我感覺很大的用處)。

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 + "開始時間:" + beforeTime);
 }
 
 private void end (String action) {
  endTime = System.currentTimeMillis();
  long time = endTime - beforeTime;
  logger.info("交易:" + action + "結(jié)束時間:" + endTime);
  logger.info("交易:" + action + "耗時:" + 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","程序報錯");
   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);
 } 
}

到這里一個網(wǎng)關(guān)就寫好了,然后我們寫一個service進(jìn)行測試一下(對應(yīng)的Dao層我就不現(xiàn)丑了,相信大家都會)

@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測試一下測試報文為:

{
 "id":"1",
 "service":"userServiceImpl"
}

控制臺打印為:

2019-10-18 17:24:41.089 INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService : 交易:userService開始時間: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é)束時間:1571390681256
2019-10-18 17:24:41.256 INFO 6452 --- [nio-8080-exec-2] c.s.s.service.util.RootService : 交易:userService耗時:167

返回為:

{
 "user": {
 "user_id": "1",
 "password": "123456",
 "user_name": "張三"
 }
}

總結(jié):這樣寫法的好處在于 1.有一個統(tǒng)一的入口,不需要在編寫controller, 可以專注于業(yè)務(wù)(service)2.可以在公共入口做公共處理。

以上這篇在java中由類名和方法名字符串實現(xiàn)其調(diào)用方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 運(yùn)用springboot搭建并部署web項目的示例

    運(yùn)用springboot搭建并部署web項目的示例

    這篇文章主要介紹了運(yùn)用springboot搭建并部署web項目的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java多線程中的ThreadLocal應(yīng)用場景及問題解讀

    Java多線程中的ThreadLocal應(yīng)用場景及問題解讀

    這篇文章主要介紹了Java多線程中的ThreadLocal應(yīng)用場景及問題解讀,ThreadLocal這個類在多線程并發(fā)中主要的使用場景是什么呢,我們都知道多線程并發(fā)問題實際就是多個線程對公共資源訪問和修改問題,需要的朋友可以參考下
    2023-12-12
  • Java中JDBC實現(xiàn)動態(tài)查詢的實例詳解

    Java中JDBC實現(xiàn)動態(tài)查詢的實例詳解

    從多個查詢條件中隨機(jī)選擇若干個組合成一個DQL語句進(jìn)行查詢,這一過程叫做動態(tài)查詢。下面通過實例代碼給大家講解JDBC實現(xiàn)動態(tài)查詢的方法,需要的朋友參考下吧
    2017-07-07
  • Java使用遞歸法解決漢諾塔問題的代碼示例

    Java使用遞歸法解決漢諾塔問題的代碼示例

    這篇文章主要介紹了Java使用遞歸法解決漢諾塔問題的代碼示例,漢諾塔問題是使用遞歸解決問題的經(jīng)典范例,用到的算法非常簡單,需要的朋友可以參考下
    2016-04-04
  • SpringBoot異常處理器的使用與添加員工功能實現(xiàn)流程介紹

    SpringBoot異常處理器的使用與添加員工功能實現(xiàn)流程介紹

    設(shè)計完了登錄與退出功能還只完成了冰山一角,經(jīng)過測試發(fā)現(xiàn),我們以url的方式來訪問網(wǎng)站時可以直接跳過登陸頁面進(jìn)入后臺頁面,這樣顯然是不合理的,下面我們通過異常攔截器+boot來做到訪問限制,以及實現(xiàn)新增員工功能,制作全局異常處理器
    2022-10-10
  • springcloud下hibernate本地化方言配置方式

    springcloud下hibernate本地化方言配置方式

    這篇文章主要介紹了springcloud下hibernate本地化方言配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 一起來學(xué)習(xí)Java IO的轉(zhuǎn)化流

    一起來學(xué)習(xí)Java IO的轉(zhuǎn)化流

    這篇文章主要為大家詳細(xì)介紹了Java IO的轉(zhuǎn)化流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 詳解Java線程池如何實現(xiàn)優(yōu)雅退出

    詳解Java線程池如何實現(xiàn)優(yōu)雅退出

    這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下
    2022-07-07
  • java實現(xiàn)多線程的兩種方式繼承Thread類和實現(xiàn)Runnable接口的方法

    java實現(xiàn)多線程的兩種方式繼承Thread類和實現(xiàn)Runnable接口的方法

    下面小編就為大家?guī)硪黄猨ava實現(xiàn)多線程的兩種方式繼承Thread類和實現(xiàn)Runnable接口的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java實現(xiàn)將PDF轉(zhuǎn)為圖片格式的方法詳解

    Java實現(xiàn)將PDF轉(zhuǎn)為圖片格式的方法詳解

    PDF文件和圖片文件,這是兩種完全不一樣的格式,可是有的時候這兩種格式卻是有相互轉(zhuǎn)換的需要,本文將介紹如何通過Java應(yīng)用程序快速高效地將PDF轉(zhuǎn)為圖片格式。一起來看看吧
    2023-03-03

最新評論

三台县| 新干县| 扶风县| 读书| 洛隆县| 章丘市| 怀集县| 苍溪县| 资中县| 竹溪县| 水城县| 泸溪县| 新干县| 普陀区| 伊宁县| 甘泉县| 华宁县| 柘荣县| 宝山区| 宣威市| 肥城市| 松原市| 稻城县| 清流县| 石嘴山市| 昭觉县| 万荣县| 宜章县| 冀州市| 商城县| 阿合奇县| 常德市| 阿图什市| 介休市| 桐柏县| 蒙自县| 霍城县| 克什克腾旗| 信宜市| 花垣县| 永川市|