问题描述
- Java利用反射执行框架注入类的非静态方法
- 之前对代码做优化,利用了反射去执行指定类的指定方法:
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.classgetSpecialAccount"" 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异常。
不知道说清楚了没,这个问题怎么解决?反射不能执行注入类的方法吗?
时间: 2024-08-02 19:23:46