java通过反射修改静态、私有、final属性
2023-12-22 17:34:27
代码上线前,有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);
}
文章来源:https://blog.csdn.net/qq_14842117/article/details/135156252
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!