android - 反射可以与属于大于最小 sdk 的方法一起使用吗?

标签 android reflection

我正在开发一个必须至少支持 10 级 sdk 的应用程序。今天,当我遇到一个我需要使用的方法 setLayerType() 时,我正在编写代码。但是这个方法是在API level 11中引入的。因此,我使用了一种变通方法并使用 Reflection 来使用此方法。

那么,我的问题是,我的应用程序是否仍会在运行 API 级别 10 的设备上崩溃?

我想到这个问题是因为,即使我在这里使用了反射,我仍然调用了 API 级别 11 中引入的方法。当我在运行 API 级别 10 的 Android 设备上运行我的应用程序时,此方法会成功运行还是会崩溃?

As stated in source ,该方法将独立于操作系统级别运行。但是,为什么它可以在 API 级别 10 设备上成功运行,而该设备仍然使用 API 级别 10 的 Android.jar 而该文件甚至不包含此方法? p>

我试图搜索它但找不到解释。

P.S. 我想在 API 级别 10 的设备上测试它,但由于构建完整的应用程序需要一些时间,因此现在无法在 API 级别 10 的设备上测试应用程序。

最佳答案

不,如果您调用 API 级别中不存在的方法,应用程序当然会崩溃。无论您是否通过反射调用都是如此。

反射(reflection)点是你根据API级别来选择是否调用。比较 http://developer.android.com/reference/android/os/Build.VERSION.html#SDK_INThttp://developer.android.com/reference/android/os/Build.VERSION_CODES.html 在您的代码中,只有在 SDK 编号足够高时才继续进行反射调用。

要点是,您将带有字节码引用的代码隔离到所有 API 级别中不存在的任何方法或常量或类中,并将其隔离到一个单独的类中,该类仅通过反射加载。

这是我为管理此类事情而创建的一些实用程序代码的示例;它根据 API 级别加载接口(interface)的一个或另一个实现:

https://code.google.com/p/zxing/source/browse/trunk/android/src/com/google/zxing/client/android/common/PlatformSupportManager.java?spec=svn2361&r=2361

编辑:@FD_ 的回答也有效,这让我感到惊讶。反射更安全,但代码更多。看起来反射方法在最近的(如果不是全部的话)Android JVM 上实际上是不必要的。

关于android - 反射可以与属于大于最小 sdk 的方法一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21450724/

相关文章:

android - 如何在自定义 ListView 中启动动画

android - Visual Studio 2010 看不到 Nexus 4

android - 在Android中居中背景图像

java - 从不同的项目访问一个类

android - 实现 ActionBar 向上按钮

java - 如何获取图像中每个像素的强度。我想计算图像中更高强度的像素

java - Java中可以通过反射创建可变数量且变量名递增的变量吗?

reflection - golang 反射(reflect)创建对象报错

java - JUnit 参数化测试不与 Mockito、Spring、Reflection 和 AspectJ 单独运行

java - 如何在不知道形式参数类型的情况下找到构造函数?