之前对代码做优化,利用了反射去执行指定类的指定方法:
public static JsonResultVO callMethod(Class<?> className, String methodName, Class<?>[] paramClass, Object[] param) {
JsonResultVO resultVO = new JsonResultVO();
try {
Method m = className.getMethod(methodName, paramClass);
resultVO = (JsonResultVO) m.invoke(className.newInstance(), param);
} catch (NoSuchMethodException e) {
throw new FrameAppException("找不到方法:" + methodName);
} catch (Exception e) {
e.printStackTrace();
}
return resultVO;
}
这个是反射方法,把要执行的类 className,方法名methodName,方法参数类型paramClass,以及要传的参数param做了封装。
WEB应用,采用SSH框架。以上方法在 TrustPayCommand 类中,通过反射执行@Service("wyBaseCommand")类中的getSpecialAccount(String accName)方法。
public JsonResultVO getSpecialAccount(WyCompanyInDataBean inDataBean) {
// 此方法仅返回商户号与收入户账号
if (SecurityContextHolder.getContext().getAuthentication() == null) {
throw new FrameAppException("请重新登陆系统!");
}
OprSessionBean opr = (OprSessionBean) SecurityContextHolder
.getContext().getAuthentication().getDetails();
JsonResultVO resultVO = new JsonResultVO();
String commercialNo = null;
Map paramMap = new HashMap();
paramMap.put("comCode", CompanyUtil.getHeadCompany(opr.getBelongComId()));
paramMap.put("specialType", Constains.SPECIAL_ACCOUNT_TYPE_WY_PAY);
List<SpecialAccount> list = persister.findListByFields(SpecialAccount.class, paramMap);
if(list.size() > 0) {
SpecialAccount s = list.get(0);
resultVO.add2Request("commercialNo", s.getCommercialNo());
resultVO.add2Request("specialAccount", s.getSpecialAccount());
resultVO.setCode("0000");
} else {
resultVO.setMsg(null);
resultVO.setCode("9999");
}
return resultVO;
}
反射执行时代码:
public static String getCommercialNo() {
JsonResultVO resultVO = new JsonResultVO();
Class<?>[] paramClass = new Class<?>[] {WyCompanyInDataBean.class};
WyCompanyInDataBean[] param = new WyCompanyInDataBean[] {new WyCompanyInDataBean()};
resultVO = callMethod(WyBaseCommand.class, "getSpecialAccount", paramClass, param);
if(resultVO.getCode().equals("0000")) {
return resultVO.getRequestMap().get("commercialNo").toString();
}
return null;
}
方法getSpecialAccount()可以进去,执行java.lang.reflect.InvocationTargetException异常,
在
List<SpecialAccount> list = persister.findListByFields(SpecialAccount.class, paramMap);
这一句java.lang.NullPointerException异常。
不知道说清楚了没,这个问题怎么解决?反射不能执行注入类的方法吗?