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

}

复制代码
相关推荐
zhangxueyi1 分钟前
Java实现快速排序算法
java·数据结构·算法
碎梦归途3 分钟前
23种设计模式-创建型模式之单例模式(Java版本)
java·开发语言·jvm·单例模式·设计模式
Yvonne9785 分钟前
Java八种常见的设计模式
java·设计模式
爱编程的鱼21 分钟前
C# 数据类型||C# 类型转换
java·算法·c#
一键三联啊21 分钟前
ArrayList的subList的数据仍是集合
java·开发语言
前鼻音太阳熊29 分钟前
【Spring Boot 应用开发】-06 自动配置-生成配置元数据
java·spring boot·后端
purrrew29 分钟前
【数据结构_8】栈和队列
java·开发语言·数据结构
汤永红31 分钟前
windows下git bash安装SDKMan报错Looking for unzip...Not found
java·git·sdkman
云惠科技(SEO)1 小时前
泛目录站群技术架构演进观察:2025年PHP+Java混合方案实战笔记
java·人工智能·搜索引擎
小奏技术1 小时前
Kafka要保证消息的发送和消费顺序性似乎没那么简单
后端·kafka