java 反射.问题_使用java反射机制遇到的问题

1 /**

2 * 用于外部接口调用3 *@author

4 *5 */

6 public class HttpLinkServlet extendsHttpServlet {7

8 /**

9 *10 */

11 private static final long serialVersionUID = -8408900345034346763L;12

13 private final static String XML_SERVICE_PATH = "Service";14 private final static String XML_SERVICE_NAME = "name";15 private final static String XML_SERVICE_CLASS = "class";16 private final static String XML_SEPARATOR = "_";17 private final static String XML_METHOD_PATH = "Method";18 private final static String XML_METHOD_CODE = "code";19 private Map serviceMap = new HashMap();20 private Map methodMap = new HashMap();21

22 private String wsfile = "/ws/ws.xml";23

24 private Logger log =Logger.getLogger(getClass());25

26 @Override27 public void init() throwsServletException {28 super.init();29 //读取配置文件

30 File file = new File(this.getClass().getResource(wsfile).getPath());31 XMLHandler xmlHandler = new XMLHandler(file,"UTF-8");32 Element rootElement =xmlHandler.getRootElement();33 List> xList =rootElement.elements(XML_SERVICE_PATH);34 //放入ws map文件;

35 for (Object serviceObj :xList) {//获取所有对外公布的service

36 Element serviceElement =(Element) serviceObj;37 String serviceName =serviceElement.attributeValue(XML_SERVICE_NAME);38 if (serviceName == null || serviceName.equals("")) {39 throw new RuntimeException("Invalid bean definition in " + wsfile + ".");40 } else if (serviceMap.get(serviceName) != null) {41 throw new RuntimeException("Duplicate webservice beans definition : " + serviceName + ".");42 }43 String className =serviceElement.attributeValue(XML_SERVICE_CLASS);44 if (className == null || className.trim().equals("")) {45 return;46 }47 WSBean beanDef = newWSBean();48 beanDef.setName(serviceName);49 beanDef.setClassName(className);50 serviceMap.put(serviceName, beanDef);51 //将方法对应的方法放入methodMap中

52 for(Object methodObj :serviceElement.elements(XML_METHOD_PATH)) {53 Element methodElement =(Element) methodObj;54 String methodCode =methodElement.attributeValue(XML_METHOD_CODE);55 }56 }57 }58

59

60 @Override61 protected voiddoGet(HttpServletRequest req, HttpServletResponse resp)62 throwsServletException, IOException {63 doPost(req, resp);64 }65

66 @Override67 protected voiddoPost(HttpServletRequest req, HttpServletResponse resp)68 throwsServletException, IOException {69 System.out.println("======欢迎调用servlet======"+req.getRequestURI() + ":" +req.getContextPath());70 String reqPath =req.getRequestURI();71 reqPath = reqPath.substring(reqPath.lastIndexOf("/")+1);72 String userId = req.getHeader("userId");73 String password = req.getHeader("password");74 String appVersion = req.getHeader("appVersion");75 String contentType = req.getHeader("Content-type");76 String acceptEncoding = req.getHeader("accept-encoding");77 String token = req.getHeader("token");78 String sessionId = req.getHeader("easycare.session.id");79 String clientIMEI = req.getHeader("client-IMEI");80 String clientType = req.getHeader("Client-Type");81

82 List label = DictUtils.getDictList("apk_version");83

84 if (!"loginService".equals(reqPath) &&StringUtils.isNotBlank(userId)) {85 //FIXME:如果包含用户id,且无登录者信息,重新登录

86 Principal p =UserUtils.getPrincipal();87 if (p == null) {88 UserDao userDao = SpringContextHolder.getBean(UserDao.class);89 User u =userDao.get(userId);90 String host =StringUtils.getRemoteAddr(req);91 Subject subject =SecurityUtils.getSubject();92 UsernamePasswordToken shiroToken = newUsernamePasswordToken(u.getLoginName(),93 password.toCharArray(), false, host, null, true);94 subject.login(shiroToken);95 }96 }97

98 ReturnBO returnBO = newReturnBO();99 try{100 String reqJson = acceptJSON(req);//得到requestContext

101 RequestBO requestBO = (RequestBO)JsonMapper.fromJsonString(reqJson, RequestBO.class);102 //JSONObject jsonObj = JSONObject.parseObject(reqJson);//转换成JSONObject

103 if (requestBO == null) {104 returnBO.setResultStr("请求参数为空,请联系管理员! ");105 } else{106 String action = requestBO.getAction();//请求方法

107 if(StringUtils.isNotBlank(action)){108 if(methodMap.keySet()!=null&&methodMap.keySet().size()>0){109 if(methodMap.keySet().contains(reqPath + XML_SEPARATOR +action)){110 String beanName = methodMap.get(reqPath + XML_SEPARATOR +action);111 if (beanName != null && !beanName.trim().equals("")) {112 WSBean wsBean =((WSBean)serviceMap.get(beanName));113 Object bean=SpringContextHolder.getBean(wsBean.getName());114

115 if (bean != null) {116 @SuppressWarnings("rawtypes")117 Class clazz =bean.getClass();118 //遍历所有方法119 //获取方法

120 Method[] allMethods =clazz.getMethods();121 Method method = null;122 for(Method _method : allMethods) {123 if(_method.getName().equals(action)) {124 method =_method;125 break;126 }127 }128 if (null ==method) {129 throw new RuntimeException("【"+ clazz.getName() + "】中不存在方法:【" + action +"】");130 }131 //参数转换,将json转化为对象

132 Object[] parameter = null;133 Class>[] parameterTypes =method.getParameterTypes();134 Class> methodParameterType = null;135 if (null != parameterTypes && parameterTypes.length > 0) {136 parameter = newObject[parameterTypes.length];137 //解决乱码问题

138 String data = new String(requestBO.getParam().getBytes("UTF-8"),"UTF-8");139 JSONArray dataArray =JSONArray.parseArray(data);140 for (int i = 0; i < parameterTypes.length; i++) {141 methodParameterType =parameterTypes[i];142 JSONObject tmpObj =dataArray.getJSONObject(i);143 parameter[i] =JSONUtils.toBean(tmpObj.toJSONString(), methodParameterType);144 }145 }146 //方法调用

147 Object returnObj = null;148 if (null != methodParameterType) {//参数不为空时

149 returnObj =ReflectionUtils.invokeMethod(method, bean, parameter);150 } else{151 returnObj =method.invoke(bean);152 }153 returnBO.setFlag(Global.TRUE);154 returnBO.setResultStr(JsonMapper.toJsonString(returnObj));155 }156 }157 } else{158 returnBO.setResultStr("action【 "+action+"】服务已停止,请联系管理员! ");159 }160 }161 } else{162 returnBO.setResultStr("action 参数为空,请联系管理员!");163 }164 }165

166 } catch(Exception e) {167 returnBO.setResultStr(e.getMessage());168 log.error(e.getMessage());169 }170 log.info("return json: "+JsonMapper.toJsonString(returnBO));171 //输出返回JSON字符串

172 resp.reset();173 resp.setContentType("application/json");174 resp.setCharacterEncoding("UTF-8");175 resp.getWriter().println(JsonMapper.toJsonString(returnBO));176 resp.addIntHeader("result-code", returnBO.getResultCode());177 resp.setHeader("apkVesion", label.get(0).getValue());178 }179

180 /**

181 * 接收客户端Json参数182 *@paramrequest183 *@return

184 */

185 publicString acceptJSON(HttpServletRequest request) {186 String acceptjson = "";187 try{188 BufferedReader br = newBufferedReader(189 new InputStreamReader((ServletInputStream) request.getInputStream(), "utf-8"));190 StringBuffer sb = new StringBuffer("");191 String temp;192 while ((temp = br.readLine()) != null) {193 sb.append(temp);194 }195 br.close();196 acceptjson =sb.toString();197 System.out.println(acceptjson);198 } catch(Exception e) {199 e.printStackTrace();200 }201 returnacceptjson;202 }203

204 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值