当前位置:首页 >> 核电技术聚变聚能设备 >> 【Spring】反射动态修改Bean实例的私有属性值,读心术游戏

【Spring】反射动态修改Bean实例的私有属性值,读心术游戏

cpugpu芯片开发光刻机 核电技术聚变聚能设备 1
文件名:【Spring】反射动态修改Bean实例的私有属性值,读心术游戏 【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()); }

协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接