我有一个Android应用程序(java)使用Android 1.6 SDK使用android.provider.Contacts类中的以下代码编译时工作正常:
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编程语言”的“反思”章节后(我本来应该先做),我现在大部分时间都能理解你可以用反射做些什么,但是一个简洁的定义反思并不容易。你的答案有助于澄清是什么引发了我的问题 - 一旦反映了一个类,并且使用反射创建了一个类的实例,你就可以像实现该类一样与实例进行交互。
这是我对简明定义的微薄尝试,这种定义远非完美,我相信我需要修改,因为我了解更多:
Reflection是使用java.lang.reflect中包含的类对象或需要使用完全限定的字符串名称初始访问类的Class或Package类对类对象进行间接,动态查询,操作或调用。
答案 0 :(得分:6)
我认为这是Java reflection(more on Android reflection for multiple-version compatibility)的定义。我不确定你的意思是“到什么程度”;它只是。
答案 1 :(得分:4)
动态询问方法的可用性是一种反思,是的。
答案 2 :(得分:1)
这是反思。
如果CONTENT_FILTER_URI
是最终的静态字段,那么您应该使用get(null)
而不是get(baseUri)
,因为您没有调用对象。
修改强>
我对你的代码感到有点困惑。据我了解您的代码段,首先您将Contacts.Phones.CONTENT_FILTER_URL
分配给URL baseUri
,然后您反映CONTENT_FILTER_URI
类上的PhoneLookup
字段,并从URL
中读取该字段值存储在baseUri
中的实例 - 只是再次将值分配给baseUri
!错字或改进的空间?
答案 3 :(得分:1)
这是关于策略,反思和其他更复杂的事情的非常好的文章,用于使用新的API,同时保持与旧平台兼容:
http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html