【Spring】反射动态修改Bean实例的私有属性值

Cannot cast 'org.springframework.http.client.InterceptingClientHttpRequestFactory' to 'org.springframework.http.client.OkHttp3ClientHttpRequestFactory'

由于RestTemplate在自定义初始化时顺序比较早,想在启动后跟进yum或者注解配置修改初始化的值时,直接修改是不能转换成功的,如下:

复制代码
RestTemplate restTemplate = GlobalContext.getApplicationContext().getBean(RestTemplate.class);
OkHttp3ClientHttpRequestFactory requestFactory = (OkHttp3ClientHttpRequestFactory)  restTemplate.getRequestFactory();
requestFactory.setReadTimeout(event.getRpcTimeOut());

这样直接改是会报错:Cannot cast 'org.springframework.http.client.InterceptingClientHttpRequestFactory' to 'org.springframework.http.client.OkHttp3ClientHttpRequestFactory'

解决方案:通过反射设置可访问,可写

ReflectionUtils.makeAccessible

将字段设置可访问,可写。本质就是调用field.setAccessible(true),让非public修饰的字段,可以操作如protected、private修饰的字段。

复制代码
	public static void makeAccessible(Field field) {
		if ((!Modifier.isPublic(field.getModifiers()) ||
				!Modifier.isPublic(field.getDeclaringClass().getModifiers()) ||
				Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
			field.setAccessible(true);
		}
	}

实例代码:

try {

Field field = InterceptingClientHttpRequestFactory.class.getSuperclass().getDeclaredField("requestFactory");

ReflectionUtils.makeAccessible(field);

OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory = (OkHttp3ClientHttpRequestFactory) field.get(factory);

okHttp3ClientHttpRequestFactory.setReadTimeout(event.getRpcTimeOut());

okHttp3ClientHttpRequestFactory.setWriteTimeout(event.getRpcTimeOut());

} catch (Exception e) {

System.out.println("ReflectionUtils.makeAccessible error:" + e.getMessage());

}

复制代码
相关推荐
i***1324几秒前
【SpringBoot】单元测试实战演示及心得分享
spring boot·后端·单元测试
路边草随风5 分钟前
flink实现写orc对数据进行分目录(分区表)写入
java·大数据·flink
s***35307 分钟前
SpringMVC新版本踩坑[已解决]
android·前端·后端
geekmice12 分钟前
通过账户信息操作加深对DTO,VO,BO理解
java
r***013813 分钟前
Java进阶,时间与日期,包装类,正则表达式
java·mysql·正则表达式
APIshop17 分钟前
Java爬虫第三方平台获取1688关键词搜索接口实战教程
java·开发语言·爬虫
k***121718 分钟前
SpringCloud实战【九】 SpringCloud服务间调用
java·spring boot·spring cloud
请为小H留灯21 分钟前
Java快捷健(详细版)
java·开发语言
执笔论英雄23 分钟前
【RL】 ROLL Generate Scheduler
java·服务器·数据库
北郭guo24 分钟前
垃圾回收底层原理【深入了解】
java·jvm·算法