Retrofit动态更换BaseUrl最后的妥协
最近接到一个需求,要让我们的app可以在测试环境和正式环境间随意切换(PS:测试环境的域名多种多样)。本来是一件特简单的事情,但是由于开发和维护Retrofit的大佬们觉得动态替换BaseUrl不安全,使得这件事情变得复杂起来。经过搜索资料以及查看源码,整理出来解决方案有如下几种。
1、更新Retrofit对象
本来项目里面是全局保存着一个Retrofit对象,再点击更换按钮的时候基于新的BaseUrl重新构建一个Retrofit对象替换掉原有的对象。但是我们项目里面用了Dagger2,Dagger2单例构建的Retrofit如何替换?额。。。好像引入的新的问题。
2、通过反射改变BaseUrl
查看Retrofit源码可知,其baseUrl为一个final修饰的HttpUrl类型的变量,所以不能也不可能有方法可以直接改掉BaseUrl。这时候我就想着可以通过反射入手去改掉这个值。所以有了如下代码。
Class<Retrofit> retrofitClass = Retrofit.class;
try {
Field baseUrlField = retrofitClass.getDeclaredField("baseUrl");
baseUrlField.setAccessible(true);
baseUrlField.set(mRetrofit, newBaseUrl);
} catch (Exception e) {
e.printStackT