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 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
    • ¥15 乘性高斯噪声在深度学习网络中的应用
    • ¥15 运筹学排序问题中的在线排序
    • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
    • ¥30 求一段fortran代码用IVF编译运行的结果
    • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败
    • ¥20 有人能用聚类分析帮我分析一下文本内容嘛