内省反射获取bean、函数和参数,调用服务

内省反射获取bean、函数和参数,调用服务

  1 import java.lang.reflect.Method;
  2 import java.lang.reflect.Parameter;
  3 import java.lang.reflect.Type;
  4 
  5 import javax.servlet.http.HttpServletRequest;
  6 
  7 import org.slf4j.Logger;
  8 import org.slf4j.LoggerFactory;
  9 import org.springframework.data.domain.PageRequest;
 10 import org.springframework.data.domain.Pageable;
 11 import org.springframework.stereotype.Controller;
 12 import org.springframework.web.bind.annotation.RequestMapping;
 13 import org.springframework.web.bind.annotation.RequestMethod;
 14 import org.springframework.web.bind.annotation.RequestParam;
 15 import org.springframework.web.bind.annotation.ResponseBody;
 16 import org.springframework.web.context.support.WebApplicationContextUtils;
 17 
 18 import com.alibaba.fastjson.JSON;
 19 import com.alibaba.fastjson.JSONObject;
 20 import com.fasterxml.jackson.core.type.TypeReference;
 21 import com.fasterxml.jackson.databind.ObjectMapper;
 22 
 23 import net.sf.json.JSONArray;
 24 
 25 /**
 26  * 
 27  * @author deleba
 28  * 2019年2月26日
 29  */
 30 @Controller
 31 @RequestMapping("/rest")
 32 public class LogRestController {
 33 
 34     private static Logger logger = LoggerFactory.getLogger(LogRestController.class);
 35 
 36     @RequestMapping(value = "/", method = RequestMethod.POST)
 37     @ResponseBody
 38     public Object taskInit(@RequestParam("serviceName") String serviceName
 39             , @RequestParam("methodName") String methodName
 40             , @RequestParam("args") String args
 41             , HttpServletRequest request) {
 42 
 43         ObjectMapper objectMapper = new ObjectMapper();
 44         JSONObject jsonObject = new JSONObject();
 45         try {
 46             serviceName = "com.deleba.service.".concat(serviceName);//包名也可以作为参数传入,灵活变化
 47             Class<?> clazz = Class.forName(serviceName);
 48             Method[] methods = clazz.getMethods();
 49             loop:
 50             for (Method method : methods) {
 51                 if (methodName.equals(method.getName())) {
 52                     Parameter[] parameters = method.getParameters();
 53                     Object[] argObjs = new Object[parameters.length];
 54                     JSONArray argsArray = JSONArray.fromObject(args);
 55 
 56                     if (parameters.length != argsArray.size()) {
 57                         continue;
 58                     }
 59                     if (argsArray != null && argsArray.size() > 0) {
 60                         for (int i = 0; i < argsArray.size(); ++i) {
 61                             String str = argsArray.get(i).toString();
 62                             if (parameters[i].getType().isAssignableFrom(String.class)) {
 63                                 argObjs[i] = str;
 64                             } else {
 65                                 ParameterTypeReference typeRef = new ParameterTypeReference(parameters[i]);
 66                                 try {
 67                                     if (typeRef.getType().getTypeName().endsWith("Pageable")) {
 68                                         logger.info(str);
 69                                         JSONObject pageJson = JSON.parseObject(str);
 70                                         Integer page = pageJson.getInteger("pageNumber");
 71                                         Integer size = pageJson.getInteger("pageSize");
 72                                         Pageable pageable = new PageRequest(page, size);
 73                                         argObjs[i] = pageable;
 74                                     } else {
 75                                         argObjs[i] = objectMapper.readValue(str, typeRef);
 76                                     }
 77                                 } catch (Exception e) {
 78                                     logger.error(e.getMessage());
 79                                     e.printStackTrace();
 80                                     continue loop;
 81                                 }
 82                             }
 83                         }
 84                     }
 85 
 86 
 87                     Object object = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()).getBean(clazz);
 88 
 89                     Object obj = method.invoke(object, argObjs);
 90                     jsonObject.put("data", obj);
 91                     jsonObject.put("msg", "");
 92                     jsonObject.put("status", "1");
 93                 }
 94             }
 95 
 96         } catch (Exception e) {
 97             logger.error(e.getMessage(), e);
 98             jsonObject.put("data", null);
 99             jsonObject.put("msg", e);
100             jsonObject.put("status", "0");
101         }
102         return jsonObject;
103     }
104 
105     class ParameterTypeReference extends TypeReference<String> {
106         private Parameter parameter;
107 
108         public ParameterTypeReference(Parameter parameter) {
109             this.parameter = parameter;
110         }
111 
112         @Override
113         public Type getType() {
114             return parameter.getParameterizedType();
115         }
116     }
117 
118 }

猜你喜欢

转载自www.cnblogs.com/deleba/p/10535110.html