首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么对HttpResponseCache使用反射?

为什么对HttpResponseCache使用反射?
EN

Stack Overflow用户
提问于 2014-04-23 13:49:05
回答 2查看 159关注 0票数 0

文档 of HttpResponseCache中有一节:

与早期版本一起工作 这个类是在Android4.0(冰淇淋三明治)中添加的。使用反射启用响应缓存,而不影响早期版本: 尝试{ httpCacheDir =新文件(context.getCacheDir(),"http");long httpCacheSize = 10 * 1024 * 1024;// 10 MiB .getMethod(“安装”,File.class,long.class) .invoke(null,httpCacheDir,httpCacheSize);} catch (异常httpResponseCacheNotAvailable) {}

您可以通过在SO (例如这里)上的一个问题和web上的示例中的反射来查看这个调用。我还接收了包含此代码段的代码来设置缓存(包括注释,所以可能只是copypasta)。但是,我不太明白你为什么要在这里使用反射。

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

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   // do something here
}

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-23 13:59:36

使用反射有什么好处?

首先,引用文件:

这个类是在Android4.0(冰淇淋三明治)中添加的。

所谓“添加”,它们意味着“添加到Android”,而“冰激凌三明治”实际上是指基于JavaDocs其余部分的Android3.2 (API级别13)。

然而,HttpResponseCache类本身已经在框架中存在了更长的时间,希望从Android1.0给出他们的建议之后。但是,这个类被标记为@hide注释,所以在API 13之前,应用程序不能直接使用它。

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

相当罕见的是,Google显式地授权使用反射来以这种方式获取隐藏的类或方法,这就是为什么您在官方文档中并不经常看到反射。

票数 0
EN

Stack Overflow用户

发布于 2014-04-23 14:00:48

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

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

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
   cache.install(file, number);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23246386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档