内省反射获取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 }