激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語言 - JAVA教程 - 在java中由類名和方法名字符串實(shí)現(xiàn)其調(diào)用方式

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

2020-09-24 15:00龍昊雪 JAVA教程

這篇文章主要介紹了在java中由類名和方法名字符串實(shí)現(xiàn)其調(diào)用方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

java里邊是通過反射機(jī)制來實(shí)現(xiàn),代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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ǔ)充知識:一個(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)目啟動時(shí)就已全部注入到spring容器中,所以我們需要寫一個(gè)工具類,可以從spring上下文(applicationContext)中獲取到對應(yīng)service

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@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))。首先我們需要先寫一個(gè)抽象類,來定義service,這樣接下來的sevice只需要繼承這個(gè)抽象類即可(我們還可以寫一些時(shí)間統(tǒng)計(jì),交易流水入庫等。。自我感覺很大的用處)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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))

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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)行測試一下(對應(yīng)的Dao層我就不現(xiàn)丑了,相信大家都會)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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測試一下測試報(bào)文為:

?
1
2
3
4
{
 "id":"1",
 "service":"userServiceImpl"
}

控制臺打印為:

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

返回為:

?
1
2
3
4
5
6
7
{
 "user": {
 "user_id": "1",
 "password": "123456",
 "user_name": "張三"
 }
}

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

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

原文鏈接:https://www.cnblogs.com/chen-lhx/p/5853957.html

延伸 · 閱讀

精彩推薦
  • JAVA教程Java程序中的延遲加載功能使用

    Java程序中的延遲加載功能使用

    這篇文章主要介紹了Java程序中的延遲加載功能使用,一定程度上有助于提升性能和降低內(nèi)存使用率,需要的朋友可以參考下 ...

    goldensun3002019-12-26
  • JAVA教程Spring Boot如何使用Spring Security進(jìn)行安全控制

    Spring Boot如何使用Spring Security進(jìn)行安全控制

    要實(shí)現(xiàn)訪問控制的方法多種多樣,可以通過Aop、攔截器實(shí)現(xiàn),也可以通過框架實(shí)現(xiàn),本文將具體介紹在Spring Boot中如何使用Spring Security進(jìn)行安全控制。...

    Joker_Ye1872020-09-20
  • JAVA教程詳解Java設(shè)計(jì)模式之備忘錄模式的使用

    詳解Java設(shè)計(jì)模式之備忘錄模式的使用

    這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式的使用,備忘錄模式中的發(fā)起者和管需要的朋友可以參考下 ...

    卡奴達(dá)摩2882020-04-01
  • JAVA教程Jrebel啟動失敗解決方案詳解

    Jrebel啟動失敗解決方案詳解

    這篇文章主要介紹了Jrebel啟動失敗解決方案詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考...

    爬行4992020-07-07
  • JAVA教程Java實(shí)現(xiàn)打字游戲

    Java實(shí)現(xiàn)打字游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)打字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 ...

    櫻薾3242020-08-04
  • JAVA教程Java如何實(shí)現(xiàn)密碼加密

    Java如何實(shí)現(xiàn)密碼加密

    這篇文章主要介紹了Java如何實(shí)現(xiàn)密碼加密,幫助大家更好的理解和學(xué)習(xí)java,感興趣的朋友可以了解下 ...

    Max_xu3112020-08-19
  • JAVA教程Scala 操作Redis使用連接池工具類RedisUtil

    Scala 操作Redis使用連接池工具類RedisUtil

    這篇文章主要介紹了Scala 操作Redis使用連接池工具類RedisUtil,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的...

    Gavin-Feng8812019-06-29
  • JAVA教程詳解java重載與覆寫的區(qū)別

    詳解java重載與覆寫的區(qū)別

    很多同學(xué)會重載和重寫分不清楚,這篇文章主要介紹了詳解java重載與覆寫的區(qū)別,有需要的朋友可以了解一下。...

    店蛋蛋4752020-06-30
主站蜘蛛池模板: 成人爽a毛片免费啪啪红桃视频 | 99精品视频在线免费观看 | 天堂成人一区二区三区 | 性盈盈盈影院 | av黄色在线免费观看 | 在线播放av网址 | 欧美成人精品不卡视频在线观看 | 一本免费视频 | 免费毛片在线 | 国产成人精品区 | 桥本有菜免费av一区二区三区 | 国产一精品一av一免费爽爽 | 99热1| 精品久久久久久成人av | 91精品国产乱码久久桃 | 91美女视频在线观看 | 成人勉费视频 | 少妇一级淫片免费放4p | 欧美国产精品久久 | 亚洲网站免费观看 | 国产精品国产成人国产三级 | 国产 视频 一区二区 | 久久久精品视频免费看 | h网站在线观看 | 久久久久久久久淑女av国产精品 | 国产精品探花在线观看 | 国产成年人视频 | 日操操夜操操 | 关键词 | 在线看毛片的网站 | 哪里可以看免费的av | 成人毛片视频在线观看 | 一区二区三区四区高清视频 | 91九色丨porny丨国产jk | 一级做a爱片久久毛片a高清 | 免费黄色一级网站 | 欧美另类69xxxxx 视频 | 日本一区免费看 | 麻豆19禁国产青草精品 | 色网站在线免费观看 | 久久精品免费国产 |