代码之家  ›  专栏  ›  技术社区  ›  fupsduck

这被认为是反射吗?程度如何?

  •  6
  • fupsduck  · 技术社区  · 15 年前

    我有一个Android应用程序(Java),它在使用Android 1.6 SDK编译时运行得很好。

    Uri baseUri = Contacts.Phones.CONTENT_FILTER_URL;
    

    当2.0 SDK出现时,android.provider.contacts类被折旧,并替换为android.provider.contactsControl。为了让一个程序同时在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中包含的类对象或需要最初使用完全限定的字符串名称访问类的类或包类对类对象进行的间接、动态查询、操作或调用。

    4 回复  |  直到 15 年前
        1
  •  6
  •   Dan Lew    15 年前

    我相信这就是 Java reflection ( more on Android reflection for multiple-version compatibility )我不知道你所说的“达到什么程度”;只是。

        2
  •  4
  •   JesperE    15 年前

    动态地请求方法的可用性是一种反射形式,是的。

        3
  •  1
  •   Andreas Dolk    15 年前

    它是反射。

    如果 CONTENT_FILTER_URI 是最后一个静态字段,则应使用 get(null) 而不是 get(baseUri) 因为您没有调用对象。

    编辑

    我对你的代码有点困惑。正如我所理解的,首先你要分配 Contacts.Phones.CONTENT_FILTER_URL URL baseUri ,然后你反映 内容过滤器 上的字段 PhoneLookup 类并从中读取该字段的值 URL 实例存储在 baseUri -只需将值赋给 巴苏里 再一次!打字错误或改进空间?

        4
  •  1
  •   hackbod    15 年前

    这是一篇关于策略、反射和其他更复杂的东西的非常好的文章,用于在与旧平台保持兼容的同时使用新的API:

    http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html