java通过反射修改静态、私有、final属性

代码上线前,有case覆盖率的要求,DesensUtil 类里的catch分支,没有case能覆盖,开始通过mock的方式,也走不进去,后就想通过反射的方式,把executor属性赋值为null,让报空指针错误。
executor的属性用private static final的方法修饰,通用的反射步骤会报错误:
java.lang.IllegalAccessException: Can not set static final com.alipay.dataseXXX to null。
后看google的文档解决了。

https://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection

需要反射的类

public class DesensUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(DesensUtil.class);


    private static final DefaultScanAndDesensExecutor executor     = new DefaultScanAndDesensExecutor();
    private static final DesensConfig                 DESENSCONFIG = new DesensConfigBuilder().appCode(CommonConstants.CLAIMCORE).build();

    /**
     * Scan and desens text string.
     *
     * @param content the content
     * @return the string
     */
    public static String scanAndDesensText(String content) {
        try {
            content = executor.scanAndDesensText(content, DESENSCONFIG);
        } catch (Throwable t) {
            LOGGER.error("scanAndDesensText error,but it is a weakly dependent call");
        }
        return content;
    }
}

测试类:

    @Test
    public void testDesensUtil() throws Exception {
        Class<?> clazz = Class.forName("com.alipay.claimcore.common.util.tools.DesensUtil");
        Field field = clazz.getDeclaredField("executor");
        DesensUtil desensUtil = new DesensUtil();
        setFinalStatic(desensUtil ,field, null);
        desensUtil.scanAndDesensText("");
    }

    private void setFinalStatic(Object obj, Field field, Object newValue) throws Exception {
        field.setAccessible(true);

        Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
        field.set(obj, newValue);
    }
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值