这被认为是反思和程度吗?

时间:2010-01-07 15:02:34

标签: java android reflection

我有一个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类对类对象进行间接,动态查询,操作或调用。

4 个答案:

答案 0 :(得分:6)

我认为这是Java reflectionmore 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