1. 程式人生 > >JAVA在泛型基類中獲取子類傳遞的泛型參數

JAVA在泛型基類中獲取子類傳遞的泛型參數

throw oca abstract () current 全部 getclass back charset

最近在開發微信代扣,涉及大量HTTP調用微信,就寫了一個泛型模板,將序列化,反序列化,HTTP調用全部整合至泛型基類中. public abstract class WxCallbackHandler<C extends WeixinReturnParameter> implements CallbackHandler { private static final org.slf4j.Logger LOG= LoggerFactory.getLogger(WxCallbackHandler.class); private static final String XML_TAG="xml"; protected ThreadLocal<C> context=new ThreadLocal<C>(); private static final Charset UTF8_CHARSET=Charset.forName("utf-8"); private XStream xStream; private static XStream wxCommonResultXStream; static { wxCommonResultXStream = NoNameCoderWithCDataFacotry.Instance().create(); wxCommonResultXStream.autodetectAnnotations(Boolean.TRUE); wxCommonResultXStream.alias(XML_TAG,WeixinXmlResult.class); } public WxCallbackHandler(){ xStream = NoNameCoderWithCDataFacotry.Instance().create(); xStream.autodetectAnnotations(Boolean.TRUE); //-----------------------------------------------------------------以下為獲取泛型參數----------------------------- Class current=this.getClass(); while(!WxCallbackHandler.class.equals(current.getSuperclass())){ current=current.getSuperclass();/*為了處理多級繼承*/ } Type genType = current.getGenericSuperclass(); Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); //=============================================獲取泛型參數結束======================= xStream.alias(XML_TAG, (Class) params[0]); } private void parser(CallbackParameter parameter){ ServletInputStream inputStream=null; try { inputStream=parameter.getRequest().getInputStream(); String xmlText = IOUtils.toString(inputStream, UTF8_CHARSET); if (LOG.isInfoEnabled()) { LOG.info("微信回調請求報文如下{}{}", parameter.toString(), xmlText); } context.set((C) xStream.fromXML(xmlText)); }catch (Throwable throwable){ LOG.error(throwable.getMessage(),throwable); throw new RuntimeException(throwable); }finally { IOUtils.closeQuietly(inputStream); } } @Override public void execute(CallbackParameter parameter) { parser(parameter); WeixinXmlResult result=new WeixinXmlResult(doExecute()); if(LOG.isInfoEnabled()){ LOG.info("回復微信調用結果如下{}", GsonUtils.defaultGson().toJson(result)); } PrintWriter writer=null; try { HttpServletResponse response = parameter.getResponse(); writer = response.getWriter(); writer.print(wxCommonResultXStream.toXML(result)); writer.flush(); }catch (Throwable throwable){ LOG.error(throwable.getMessage(),throwable); throw new RuntimeException(throwable); } finally { IOUtils.closeQuietly(writer); } } public abstract boolean doExecute(); }

JAVA在泛型基類中獲取子類傳遞的泛型參數