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

}

复制代码
相关推荐
间彧12 小时前
InfluxDB详解与应用实战
后端
间彧12 小时前
对比InfluxDB与Prometheus在监控场景下的特点及选型建议
后端
java1234_小锋12 小时前
Spring事件监听的核心机制是什么?
java·spring·面试
间彧13 小时前
面向切面编程(AOP)中的“通知”和 专门用于增强 Spring MVC 中控制器(Controller)的“通知”
后端
逻极13 小时前
Rust数据类型(下):复合类型详解
开发语言·后端·rust
星释13 小时前
Rust 练习册 12:所有权系统
开发语言·后端·rust
间彧13 小时前
AOP中的五种通知类型在实际项目中如何选择?举例说明各自的典型应用场景
后端
间彧13 小时前
Spring Boot中很多Advice后缀的注解和类,都是干什么的
后端
星释13 小时前
Rust 练习册 16:Trait 作为返回类型
java·网络·rust
2301_7965125213 小时前
Rust编程学习 - 如何理解Rust 语言提供了所有权、默认move 语义、借用、生命周期、内部可变性
java·学习·rust