【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());

}

复制代码
相关推荐
包饭厅咸鱼9 分钟前
autojs----2025淘宝淘金币跳一跳自动化
java·javascript·自动化
骇客野人18 分钟前
Spring Boot项目快速稳健架构指南
spring boot·后端·架构
..过云雨22 分钟前
11.【Linux系统编程】文件系统详解——从磁盘硬件到文件系统
linux·c++·后端·缓存
IT_陈寒23 分钟前
震惊!我用JavaScript实现了Excel的这5个核心功能,同事直呼内行!
前端·人工智能·后端
国服第二切图仔29 分钟前
Rust开发之Trait作为参数与返回值使用
开发语言·后端·rust
武子康32 分钟前
大数据-141 ClickHouse 副本实战 | ReplicatedMergeTree + ZooKeeper 从 0–1:创建、选举、日志复制、排障
大数据·后端·nosql
码住懒羊羊35 分钟前
【C++】模板进阶 | 继承
android·java·c++
前端伪大叔36 分钟前
freqtrade智能挂单策略,让你的资金利用率提升 50%+
前端·javascript·后端
urkay-37 分钟前
Android 线程详解
android·java·kotlin·iphone·androidx
小猪绝不放弃.39 分钟前
Spring Boot项目的核心依赖
java·spring boot·后端