为什么要为HttpResponseCache使用反射?

时间:2014-04-23 13:49:05

标签: java android reflection httpresponsecache

HttpResponseCache的{​​{3}}中有一个部分:

  

使用早期版本

     

此类已添加到Android 4.0(冰淇淋三明治)中。使用   反射以启用响应缓存而不会影响先前   版本:

try {
    File httpCacheDir = new File(context.getCacheDir(), "http");
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    Class.forName("android.net.http.HttpResponseCache")
        .getMethod("install", File.class, long.class)
        .invoke(null, httpCacheDir, httpCacheSize);
}
catch (Exception httpResponseCacheNotAvailable) {
}

您可以在SO(例如documentation)上的问题中通过反思看到此调用,以及网络上的示例。我还接管了包含这个完整代码段的代码来设置缓存(包括注释,所以它可能只是copypasta)。但是,我不太明白为什么你必须在这里使用反射。

通常,当我想使用在我定义的minSdkVersion之上的特定API级别添加的方法时,我会使用以下模式:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   // do something here
}

所以为什么这不是HttpResponseCache的默认模式。使用反射有什么好处?它肯定不会增加我的代码的可读性。在使用反射时,HttpResponseCache实际上是否在ICS之下工作?

编辑:我在这里没有旧的Android设备而且我的模拟器完全拒绝启动,因此我暂时无法对其进行测试。也许它只是在没有反思的情况下崩溃。

2 个答案:

答案 0 :(得分:0)

  

使用反射有什么好处?

首先,引用文档:

  

此类已添加到Android 4.0(冰淇淋三明治)中。

通过"添加",他们的意思是"被添加到 Android SDK "和#34; Ice Cream Sandwich" ,它们的确意味着基于其他JavaDocs的Android 3.2(API Level 13)。

然而,HttpResponseCache类本身已经存在于框架中更长时间,希望自Android 1.0给出他们的建议。但是,该类标有@hide注释,因此在API级别为13之前,应用程序无法直接使用该类。

使用Build的Java版本保护块将避免直接在旧设备上引用此类。但是,它实际上并不在旧设备上配置缓存。 他们的方法适用于所有版本的Android,并允许您配置缓存,因为该类从一开始就存在。

很明显,谷歌明确授权使用反射以这种方式获取隐藏的类或方法,这就是为什么你不经常在官方文档中看到它。

答案 1 :(得分:0)

不幸的是,您的建议不适用于旧版本。想想以下几点。他们在新版本中添加了方法install(File, long)。但是调用此方法的代码被打包到其他jar中。

现在您拥有包含HttpResponseCache的旧版jar和调用它的新版jar。如果你在那里写

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   cache.install(file, number);
}
即使if的表达式为false,也会抛出

NoSuchMethodError。 使用反射是一种丑陋但有用的技术来防止这种情况。