为什么对HttpResponseCache使用反射



HttpResponseCache的文档中有一个部分:

使用早期版本

这个类是在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上的问题(例如这里)和网络上的例子中的反思来看到这个电话。我还接管了包含这个确切片段的代码来设置缓存(包括注释,所以可能只是复制)。然而,我不太明白为什么你必须在这里使用反射。

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

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

那么为什么这不是CCD_ 3的默认模式呢。使用反射的优点是什么?它当然不会增加我代码的可读性。当以这种方式使用反射时,HttpResponseCache实际上在ICS以下工作吗?

编辑:我这里没有旧的Android设备,我的模拟器根本拒绝启动,所以我现在不能简单地测试它。也许它只是在没有反思的情况下可怕地崩溃了。

使用反射的优点是什么?

首先,引用文档:

这个类是在Android 4.0(冰淇淋三明治)中添加的。

"被添加"是指"被添加到Android SDK中",而"冰淇淋三明治"实际上是指基于其余JavaDocs的Android 3.2(API 13级)。

然而,HttpResponseCache类本身在框架中存在的时间更长,希望是在Android1.0给出建议之后。然而,该类是用@hide注释标记的,因此直到API 13级才能被应用程序直接使用。

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

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

很遗憾,您的建议不适用于旧版本。思考以下内容。他们在新版本中添加了方法install(File, long)。但是调用这个方法的代码被打包到另一个jar中。

现在您有了包含HttpResponseCache的旧版本jar和调用它的新版本jar

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   cache.install(file, number);
}

即使if的表达式为false,也会抛出NoSuchMethodError。使用反射是一种丑陋但有用的技术来防止这种情况。

相关内容

  • 没有找到相关文章

最新更新