反射调用private方法的坑

使用反射调用私有方法时,发现空指针异常,无法直接注入导致空指针异常
反射调用private方法的坑_第1张图片
加入如下代码后,恢复正常

	if (AopUtils.isCglibProxy(marketSmsTaskService)) {
            // 如果是cglib代理对象,则转为原始对象
            marketSmsTaskService = (MarketSmsTaskServiceImpl) AopProxyUtils.getSingletonTarget(marketSmsTaskService);
        }

反射调用private方法的坑_第2张图片

 	@Test
    public void send() throws Exception {
        String thirdUserId = "2022062112933319";
        String thirdMerchantId = "201403172000003706";
        ParseSmsContentInfo parseSmsContentInfo = new ParseSmsContentInfo();
        UserInfo userInfo = new UserInfo();
        userInfo.setThirdUserId(thirdUserId);
        userInfo.setThirdMerchantId(thirdMerchantId);
        parseSmsContentInfo.setUserInfo(userInfo);

        Method sendSms = MarketSmsTaskServiceImpl.class.getDeclaredMethod("sendSms", String.class, ParseSmsContentInfo.class, String.class);
        sendSms.setAccessible(true);
        // 由于cglib类是通过继承代理,无法代理私有方法,因此无法通过原始对象执行方法
        if (AopUtils.isCglibProxy(marketSmsTaskService)) {
            // 如果是cglib代理对象,则转为原始对象
            marketSmsTaskService = (MarketSmsTaskServiceImpl) AopProxyUtils.getSingletonTarget(marketSmsTaskService);
        }
        sendSms.invoke(marketSmsTaskService, thirdUserId, parseSmsContentInfo, "ce shi");
    }

你可能感兴趣的:(工具代码片段,java)