自定义okhttp3拦截器调用RealConnection.noNewExchanges()报找不到符号错误
问题原因及解决方案
报错根因
okhttp3.internal包属于OkHttp官方预留的内部私有API范围,不对外保证跨版本兼容性,方法定义、访问修饰符都可能随版本迭代变更:- 你当前引入的OkHttp版本中,
RealConnection类的noNewExchanges()方法要么已被移除,要么被设置为private/protected访问权限,哪怕你把自定义类放在同包路径下,也无权限访问非包可见级别的方法 - 部分高版本OkHttp中,
noNewExchanges已经从方法调整为public volatile类型的成员变量,使用方法调用形式自然会报找不到符号错误
- 你当前引入的OkHttp版本中,
修复方案
- 第一步先核对你当前依赖的OkHttp版本对应的
RealConnection源码实现,再对应调整代码:- 若该版本中
noNewExchanges是成员变量,将调用代码改为赋值写法:realConnection.noNewExchanges = true; - 若该版本中
noNewExchanges()是私有方法,使用反射方式调用:try { Method noNewExchangesMethod = RealConnection.class.getDeclaredMethod("noNewExchanges"); noNewExchangesMethod.setAccessible(true); noNewExchangesMethod.invoke(realConnection); } catch (Exception e) { // 自行补充异常处理逻辑 }
- 若该版本中
- 非必要场景不建议依赖OkHttp的internal包API,这类API没有兼容承诺,后续升级OkHttp版本时极易出现兼容问题。如果你的需求是禁止当前连接复用,可优先使用OkHttp公开API实现:给请求头添加
Connection: close即可。
内容的提问来源于stack exchange,提问作者mkg
相关产品推荐
相关产品推荐

