我有一个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编程语言》中的“反射”章节(我本应该先这样做),我现在大部分理解了反射可以做什么,但是对于反射的简洁定义并不容易得到。您的答案有助于澄清我的问题 - 一旦对类进行了反射,并使用反射创建了类的实例,则可以像新建类一样与实例交互。
这是我关于反射的简明定义的微薄尝试,远非完美,我相信我需要在学习更多后进行修订:
反射是使用java.lang.reflect中包含的类对象或Class或Package类中包含的类对象间接动态查询、操作或调用类对象,需要最初使用完全限定的字符串名称访问类。