可以与属于最小SDK的方法一起使用反射



我正在开发一个必须以10级SDK支持的应用程序。今天,当我遇到需要使用的方法setLayerType()时,我正在编码。但是此方法是在 API级别11 中引入的。因此,我使用了解决方法,并使用了反射使用此方法。

所以,我的问题是,我的应用程序不会在API级别运行的设备上崩溃?

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

会崩溃?

如源中所述,该方法将独立于OS级别运行。但是,为什么它应该在API级别10设备上成功运行仍在使用API级别10的Android.jar,并且该文件甚至不包含此方法?

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

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

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

反思的重点是您选择是否基于API级别调用它。将http://developer.android.com/reference/android/os/Build.VERSION.html#SDK_INT与您的代码中的http://developer.android.com/reference/android/os/Build.VERSION_CODES.html进行比较,并且仅在SDK号足够高的情况下进行反射调用。

关键是,您将代码与字节码引用隔离到所有API级别中不存在的任何方法,常数或类中,该类别仅通过反射加载。

这是我创建的一些实用程序代码的示例,只是为了管理这种事情。它基于API级别加载一个或另一个接口的实现:

https://code.google.com/p/zxing/source/source/browse/trunk/android/src/src/com/google/zxing/client/client/client/common/common/common/platformsupportsupportmanager.java?

编辑: @fd_的答案也有效,这让我感到惊讶。反射更安全,但代码更大。似乎对反射方法实际上是不必要的,即使不是全部,Android JVM。

您甚至不需要反射。只需将目标SDK指定尽可能高即可,即然后,在调用 的方法之前,只需检查您的应用程序正在运行的API版本:

if (android.os.Build.VERSION.SDK_INT >= 11) {
    //Your code here
}

尝试使用以后的API版本中引入的方法将导致崩溃,否则无论您是否使用反射调用。

相关内容

最新更新