2 melvek melvek 于 2014.11.05 18:56 提问

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.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异常。

不知道说清楚了没,这个问题怎么解决?反射不能执行注入类的方法吗?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!