melvek 2014-11-05 10:56 采纳率: 0%
浏览 2408

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

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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 MATLAB怎么通过柱坐标变换画开口是圆形的旋转抛物面?
    • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
    • ¥15 解riccati方程组
    • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
    • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
    • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
    • ¥50 树莓派安卓APK系统签名
    • ¥65 汇编语言除法溢出问题
    • ¥15 Visual Studio问题
    • ¥20 求一个html代码,有偿