• JAVA反射机制实现调用类的方法


    NmsMonitorDrillController

    1. package com.nrxt.nms.mon.ms.controller;
    2. import com.nrxt.nms.mon.ms.service.impl.NmsMonitorDrillService;
    3. import com.nrxt.nms.mon.ms.utils.ByteArrayUtil;
    4. import org.apache.log4j.Logger;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.web.bind.annotation.RequestBody;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import org.springframework.web.bind.annotation.RequestMethod;
    9. import org.springframework.web.bind.annotation.ResponseBody;
    10. import javax.annotation.Resource;
    11. import javax.servlet.http.HttpServletRequest;
    12. import javax.servlet.http.HttpServletResponse;
    13. import java.io.IOException;
    14. @Controller
    15. @RequestMapping(value = "/monitor/interface")
    16. public class NmsMonitorDrillController {
    17. @Resource
    18. NmsMonitorDrillService nmsMonitorDrillService;
    19. private static final Logger logger = Logger.getLogger(NmsMonitorDrillController.class);
    20. @ResponseBody
    21. @RequestMapping(value = "/queryByDrillReceive", method = RequestMethod.POST)
    22. public byte[] queryByDrillReceive(HttpServletRequest request, HttpServletResponse response) {
    23. String param;
    24. try {
    25. param = ByteArrayUtil.inputStreamToObject(request.getInputStream(), logger).toString();
    26. if (param == null) {
    27. return null;
    28. }
    29. } catch (IOException e) {
    30. e.printStackTrace();
    31. return null;
    32. }
    33. String responseStr = nmsMonitorDrillService.queryByDrillReceive(param);
    34. return ByteArrayUtil.objectToByteArray(responseStr, logger);
    35. }
    36. @ResponseBody
    37. @RequestMapping(value = "/queryByDrillSend", method = RequestMethod.POST)
    38. public String queryByDrillSend(HttpServletRequest request, @RequestBody String param) {
    39. return nmsMonitorDrillService.queryByDrillSend(param);
    40. }
    41. }

    NmsMonitorDrillService

    1. package com.nrxt.nms.mon.ms.service.impl;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.nrxt.nms.mon.ms.dao.NmsAppConfDao;
    4. import com.nrxt.nms.mon.ms.utils.ByteArrayUtil;
    5. import com.nrxt.nms.mon.ms.utils.DrillUtils;
    6. import org.apache.commons.lang.StringUtils;
    7. import org.apache.log4j.Logger;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.context.ApplicationContext;
    10. import org.springframework.stereotype.Service;
    11. import org.springframework.web.client.RestTemplate;
    12. import javax.annotation.Resource;
    13. import javax.servlet.http.HttpServletResponse;
    14. import java.lang.reflect.InvocationTargetException;
    15. import java.lang.reflect.Method;
    16. @Service
    17. public class NmsMonitorDrillService {
    18. @Resource
    19. NmsAppConfDao nmsAppConfDao;
    20. @Autowired
    21. private RestTemplate restTemplate;
    22. @Autowired
    23. private ApplicationContext applicationContext;
    24. private static final Logger logger = Logger.getLogger(NmsMonitorDrillService.class);
    25. public String queryByDrillSend(String param) {
    26. JSONObject requestParam = JSONObject.parseObject(param);
    27. JSONObject requestHead = requestParam.getJSONObject("head");
    28. String bgId = requestHead.getString("bgId");
    29. if (StringUtils.isEmpty(bgId)) {
    30. return "bgId can not be null";
    31. }
    32. String corpCode = requestHead.getString("corpCode");
    33. if (StringUtils.isEmpty(corpCode)) {
    34. return "corpCode can not be null";
    35. }
    36. String drillUrl = "http://127.0.0.1:30098/monitor/interface/queryByDrillReceive";
    37. drillUrl = nmsAppConfDao.queryBgPathByBgCode(corpCode);
    38. byte[] compressedDatas = ByteArrayUtil.objectToByteArray(param, logger);
    39. String uploadResult = DrillUtils.tryUpload(compressedDatas, drillUrl,restTemplate ,logger).toString();
    40. return uploadResult;
    41. }
    42. public String queryByDrillReceive(String param){
    43. JSONObject requestParam = JSONObject.parseObject(param);
    44. JSONObject requestHead = requestParam.getJSONObject("head");
    45. String result = null;
    46. // 获取类的全路径以及名称
    47. String className = requestHead.get("className").toString();
    48. if(!className.contains(".")){
    49. className = "com.nrxt.nms.mon.ms.controller." + className;
    50. }
    51. // 获取方法名
    52. String functionName = requestHead.get("functionName").toString();
    53. try {
    54. Object classBean = applicationContext.getBean(Class.forName(className));
    55. // 获取class文件
    56. Class clazz = classBean.getClass();
    57. // 获取该类所需求的方法
    58. Method method = clazz.getMethod(functionName, HttpServletResponse.class,String.class);
    59. result = method.invoke(classBean,null,param).toString();
    60. } catch (NoSuchMethodException e) {
    61. e.printStackTrace();
    62. } catch (IllegalAccessException e) {
    63. e.printStackTrace();
    64. } catch (InvocationTargetException e) {
    65. e.printStackTrace();
    66. } catch (ClassNotFoundException e) {
    67. e.printStackTrace();
    68. }
    69. return result;
    70. }
    71. }

    DrillUtils

    1. package com.nrxt.nms.mon.ms.utils;
    2. import com.xxl.job.core.log.XxlJobLogger;
    3. import org.apache.log4j.Logger;
    4. import org.springframework.http.HttpEntity;
    5. import org.springframework.http.HttpHeaders;
    6. import org.springframework.http.HttpMethod;
    7. import org.springframework.http.ResponseEntity;
    8. import org.springframework.web.client.RestTemplate;
    9. public class DrillUtils {
    10. public static Object tryUpload(byte[] compressedDatas, String url, RestTemplate restTemplate, Logger logger) {
    11. Object result = null;
    12. HttpHeaders headers = new HttpHeaders();
    13. headers.add("Content-Type", "application/json");
    14. headers.add("Content-Encoding", "gzip");
    15. headers.add("Accept", "application/json");
    16. HttpEntity<byte[]> entity = new HttpEntity(compressedDatas, headers);
    17. ResponseEntity<byte[]> exchange;
    18. for (int i = 0; i < 3; i++) {//重连3次
    19. exchange = postByteMsg(url, restTemplate,entity);
    20. if (exchange != null) {
    21. byte[] returnResult = exchange.getBody();
    22. if (returnResult != null) {
    23. return com.nrxt.nms.mon.ms.utils.ByteArrayUtil.byteArrayToObject(exchange.getBody(), logger);
    24. }
    25. break;
    26. } else {
    27. XxlJobLogger.log("尝试第" + (i + 1) + "次发送");
    28. }
    29. }
    30. return result;
    31. }
    32. private static ResponseEntity<byte[]> postByteMsg(String url, RestTemplate restTemplate, HttpEntity<byte[]> entity) {
    33. try {
    34. return restTemplate.exchange(url, HttpMethod.POST, entity, byte[].class);
    35. } catch (Exception e) {
    36. XxlJobLogger.log("发送错误:");
    37. XxlJobLogger.log(e);
    38. return null;
    39. }
    40. }
    41. }

    ByteArrayUtil

    1. package com.nrxt.nms.mon.ms.utils;
    2. import org.apache.commons.codec.binary.Base64;
    3. import org.apache.log4j.Logger;
    4. import javax.servlet.ServletInputStream;
    5. import java.io.*;
    6. import java.util.HashMap;
    7. import java.util.Map;
    8. import java.util.zip.GZIPInputStream;
    9. import java.util.zip.GZIPOutputStream;
    10. public class ByteArrayUtil {
    11. /**
    12. * Object转为byte[]
    13. *
    14. * @param obj
    15. * @return
    16. * @throws IOException
    17. */
    18. public static byte[] objectToByteArray(Object obj, Logger logger) {
    19. byte[] bytes = null;
    20. ByteArrayOutputStream byteArrayOutputStream = null;
    21. GZIPOutputStream gzipOutputStream = null;
    22. ObjectOutputStream objectOutputSream = null;
    23. byteArrayOutputStream = new ByteArrayOutputStream();
    24. try {
    25. gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
    26. objectOutputSream = new ObjectOutputStream(gzipOutputStream);
    27. objectOutputSream.writeObject(obj);
    28. objectOutputSream.flush();
    29. objectOutputSream.close();
    30. objectOutputSream = null;
    31. gzipOutputStream.close();
    32. gzipOutputStream = null;
    33. bytes = byteArrayOutputStream.toByteArray();
    34. byteArrayOutputStream.close();
    35. byteArrayOutputStream = null;
    36. } catch (IOException e) {
    37. e.printStackTrace();
    38. if (logger != null)
    39. logger.error("消息序列化+压缩失败", e);
    40. } finally {
    41. if (objectOutputSream != null) {
    42. try {
    43. objectOutputSream.close();
    44. } catch (IOException e) {
    45. }
    46. }
    47. if (gzipOutputStream != null) {
    48. try {
    49. gzipOutputStream.close();
    50. } catch (IOException e) {
    51. }
    52. }
    53. if (byteArrayOutputStream != null) {
    54. try {
    55. byteArrayOutputStream.close();
    56. } catch (IOException e) {
    57. }
    58. }
    59. }
    60. return bytes;
    61. }
    62. /**
    63. * byte[]转为Object
    64. *
    65. * @param bytes
    66. * @return
    67. * @throws IOException
    68. * @throws ClassNotFoundException
    69. */
    70. public static Object byteArrayToObject(byte[] bytes, Logger logger) {
    71. Object obj = null;
    72. ByteArrayInputStream inputStream = null;
    73. GZIPInputStream gzin = null;
    74. ObjectInputStream objInt = null;
    75. try {
    76. inputStream = new ByteArrayInputStream(bytes);
    77. gzin = new GZIPInputStream(inputStream);
    78. objInt = new ObjectInputStream(gzin);
    79. obj = objInt.readObject();
    80. } catch (IOException | ClassNotFoundException e) {
    81. e.printStackTrace();
    82. if (logger != null)
    83. logger.error("消息解压缩+反序列化失败", e);
    84. } finally {
    85. if (objInt != null)
    86. try {
    87. objInt.close();
    88. } catch (IOException e) {
    89. }
    90. if (gzin != null)
    91. try {
    92. gzin.close();
    93. } catch (IOException e) {
    94. }
    95. if (inputStream != null)
    96. try {
    97. inputStream.close();
    98. } catch (IOException e) {
    99. }
    100. }
    101. return obj;
    102. }
    103. public static Object inputStreamToObject(ServletInputStream inputStream, Logger logger) {
    104. Object obj = null;
    105. GZIPInputStream gzin = null;
    106. ObjectInputStream objInt = null;
    107. try {
    108. gzin = new GZIPInputStream(inputStream);
    109. objInt = new ObjectInputStream(gzin);
    110. obj = objInt.readObject();
    111. } catch (IOException | ClassNotFoundException e) {
    112. e.printStackTrace();
    113. if (logger != null)
    114. logger.error("消息解压缩+反序列化失败", e);
    115. } finally {
    116. if (objInt != null)
    117. try {
    118. objInt.close();
    119. } catch (IOException e) {
    120. }
    121. if (gzin != null)
    122. try {
    123. gzin.close();
    124. } catch (IOException e) {
    125. }
    126. if (inputStream != null)
    127. try {
    128. inputStream.close();
    129. } catch (IOException e) {
    130. }
    131. }
    132. return obj;
    133. }
    134. }

  • 相关阅读:
    ubuntu 18.04 安装jdk
    MATLAB算法实战应用案例精讲-【数模应用】理想解法(TOPSIS)(附MATLAB和Python代码)
    docker介绍、安装及卸载
    docker镜像配置mysql、redis
    Spring_IOC
    stable diffusion学习笔记【2023-10-2】
    TiDB 集群故障诊断
    Qt学习26 布局管理综合实例
    去外地旅游遇到的问题和心得
    半同态加密(Partially Homomorphic Encryption, PHE)
  • 原文地址:https://blog.csdn.net/qq_41482600/article/details/134328045