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

}

复制代码
相关推荐
JavacKaka6 小时前
LiteFlow规则引擎实战博客-2026-09-09
java
学渣超6 小时前
记一次复杂业务功能重构——从过程式长链路,到模板方法构建体系
java·架构·代码规范
用户408527444146 小时前
一个个人开发者,怎么啃下 12 种工控协议?
后端
Bs_MoneyMagnet7 小时前
基于springboot+vue的旅游景区点评系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·旅游
cpp_learner7 小时前
Qt 5.14.2 x86_64 静态编译 —— 从零搭建完整手册
后端
夜不会漫长7 小时前
C++:类和对象(2)
java·javascript·c++
IT毕设实战小研7 小时前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
星辞秋7 小时前
Java 入门实战:从零搭建环境到写出第一个可用的命令行工具
java
ch.ju7 小时前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
土司大王7 小时前
LeetCode hot100——74.搜索二维矩阵:Java 二分模板
java·算法·leetcode