是的,你可以这样做。实际上,有不止一种方法。(请注意:此答案的唯一Android特定部分是您查找平台版本的方式。)
假设该类在版本2.0及更高版本中
X具有方法
void y(),但以前没有。
调用该方法而不引入任何编译时相关性的一种方法是使用反射来定位方法并对其进行调用
invoke。例如:
X x = ...if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) { // (exception handling omitted ...) Method m = c.getClass().getDeclaredMethod("y"); m.invoke(x);}另一种方法是为您的应用程序创建版本兼容性适配器API,如下所示:
interface Compat { void doY();}class CompatV1 { public void y(X x) { // do nothing }}class CompatV2 { public void y(X x) { x.y(); }}// // Code to instantiate the relevant adapter for the current platform.//Class<?> compatClass;// (Exception handling omitted)if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) { compatClass = Class.forName("...CompatV1");} else { compatClass = Class.forName("...CompatV2");}// (Exception handling omitted)Compat compat = (Compat) compatClass.newInstance();// The adapter object can be passed around as a parameter, wrapped// as a singleton or injected using dependency injection.// Invoke X.y() as follows:X x = ...compat.y(x);第二个版本看起来有点重量级,但是它的优点是动态(慢速,非类型安全的)代码仅执行一次,并且版本特定的代码与其余代码隔离。在现实生活中,您可能会将许多方法放入适配器接口。
这种方法需要更多的思考,才能弄清楚如何设计兼容性API,以便将版本依赖性与其余代码完全隔离。您可能还必须修改适配器API,并为每个新的(不兼容的)主要版本创建新的适配器类。
最后,如果需要更改平台API以适应新的版本中 删除 的旧版本中使用的类或方法,则需要
CompatV*使用不同的Android SDK
编译各种适配器类(例如,这些类)。这将使您的构建过程变得更加复杂。
有关此问题的其他“建议”,请阅读Android博客上的以下文章:
- Android应用程序的向后兼容性
- 如何也要吃(杯子)蛋糕。



