【发布时间】:2010-01-07 15:02:34
【问题描述】:
我有一个 Android 应用程序 (java),在使用 android.provider.Contacts 类中的以下代码使用 Android 1.6 SDK 编译时运行良好:
Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;
当 2.0 SDK 出来时,android.provider.Contacts 类被贬低并被 android.provider.ContactsContract 取代。为了让一个程序同时在 1.6 和 2.0 上运行,我在 1.6 下编译了以下更改:
Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;
…
try {
Class<?> c = Class.forName("android.provider.ContactsContract$PhoneLookup");
baseUri = (Uri) c.getField("CONTENT_FILTER_URI").get(baseUri);
}
catch (Exception e) {
}
因为我是在 1.6 下编译的,所以我无法导入 android.provider.ContactsContract,因为它是一个只有 2.0 知道的类。这被认为是反思吗?程度如何?
已添加评论: 在阅读了“Java 编程语言”的“反射”一章(我应该先完成)之后,我现在基本了解了反射可以做什么,但定义很简洁反思来之不易。您的回答有助于澄清是什么引发了我的问题 - 一旦一个类被反射,并且使用反射创建了一个类的实例,您就可以与该实例进行交互,就好像该类是新的一样。
这是我对一个远非完美的简明定义的微不足道的尝试,我相信我需要在了解更多信息时进行修改:
反射是使用包含在 java.lang.reflect 或 Class 或 Package 类中的类对象的间接、动态查询、操作或调用,最初需要使用完全限定的字符串名称访问类。
【问题讨论】:
-
请注意,尽管 URI 在 2.0 中已弃用,但该功能仍应在框架中存在一段时间(尽管有时 Android 对“弃用”一词有自己的解释)。
-
你说得对,它仍然存在,只是2.0下的功能不起作用。不检索请求的联系人。我不记得它是否每次都返回没有联系人或“我的联系人卡片”联系人。
-
代替上面的代码,并且依靠 ClassNotFound 异常,您可以通过环境属性主动检查您的代码正在运行的 Android 版本,然后切换调用返回的子函数BaseURI
-
我试过了,但我必须在 1.6 下编译才能让一个应用程序同时在 1.6 和 2.0 上运行,因此在 2.0 上运行时 android.provider.ContactsContract 类不能直接使用(因为它是编译的在 1.6 中)。这就是我必须使用反射的原因。
标签: java android reflection