`

Android中巧用Java反射机制

 
阅读更多

在Android中,可以从下面两点考虑来使用Java反射(Java Reflection)机制,从而达到意想不到的效果。这里也将展示Google是怎样在自己的应用中来使用Java反射机制的。

 

1. 同时兼容新老版本的SDK

Android往往会在新版本中引入一些新的API来替代老的API,这些新的API在性能或者易用性上比老的API更好。但为了兼容性,新老API往往是共存的。

在这种情况下,你的应用如果调用了新的API,是没办法在安装老版本Android的设备上运行的,但如果使用老的API,又没办法在安装新版本Android的设备上体现新API的性能。

这时候,就可以使用Java反射机制,从而实现一个apk,如果安装在老版本Android的设备上,则调用老的API;安装在新版本Android的设备上,则调用新的API。

下面是来自Google的一段代码:

public class SharedPreferencesCompat {

    private static final Method sApplyMethod = findApplyMethod();

    private static Method findApplyMethod() {
        try {
            return SharedPreferences.Editor.class.getMethod("apply", new Class[0]);
        } catch (NoSuchMethodException e) {
            return null;
        }
    }

    public static void apply(SharedPreferences.Editor editor) {
        if (sApplyMethod != null) {
            try {
                sApplyMethod.invoke(editor, new Object[0]);
                return;
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
        }
        editor.commit();
    }
}

 

2. 使用私有的API

如果在Eclipse上开发应用,必须调用对应的Android SDK的标准API,即在开发文档中说明的API。调用非标准的即私有的API,是编译不过的。

但Android实际上有很多API,是被@hide标注的。被@hide注解的类和方法就是私有API。如果一个应用想调用这些API,则只有在编译整个系统image的时候才能编译过,而在Eclipse上是编译不过的。所以,这些API往往会被手机开发商的本地应用调用,则第三方的应用是没办法调用的。

这种情况下,可以使用Java反射机制来调用这些私有的API。一旦编译通过生成了apk,就能正常在手机上运行,因为这样的API的实现已经在手机系统中只是没有公开出来。

下面是来自Google的一段代码:

private static final String AMR_INPUT_STREAM_CLASS = "android.media.AmrInputStream";

private static Class<?> getAmrInputStreamClass() throws ClassNotFoundException {
    return Class.forName(AMR_INPUT_STREAM_CLASS);
}

private static InputStream createAmrInputStream(InputStream in) {
    try {
        Class<?> clazz = getAmrInputStreamClass();
        Constructor<?> constructor = clazz.getConstructor(new Class[] { InputStream.class });
        return (InputStream)constructor.newInstance(new Object[] { in });
    } 
    ...
}


 

 

3
0
分享到:
评论

相关推荐

    在android中利用JAVA反射机制终止通话

    一、《在android中利用JAVA反射机制终止通话》:http://www.mydreamsky.tk/?p=874 二、《Android 电话的反射调用机制实现静默接听电话》:http://blog.csdn.net/zengyangtech/article/details/6198355 源码在...

    android系统java反射机制详解

    详细解析java的反射机制

    java反射机制的原理及在Android下的简单应用

    java反射机制的原理及在Android下的简单应用

    Java反射机制测试Demo

    学习反射机制时候,编写的Demo.代码写的有点乱,具体可以大家自己琢磨下,其中包括Excel的操作Jar包

    关于Java反射机制的小例子

    要使用蓝牙设备进行通讯必须的先使两个设备之间建立连接,Android SDK中提供了一些方法可供调用,但是有些方法没有提供接口,于是参考了网上的一些资料写了这个例子,顺便学习下Android反射机制的使用,自测OK,留待...

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究

    Java反射机制的原理及在Android下的简单应用[归纳].pdf

    Java反射机制的原理及在Android下的简单应用[归纳].pdf

    Java 学习之反射机制及应用场景

    前言:  近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,...  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方

    java中的反射机制

    Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常...在实际的开发中会用到的比如:手动打开状态栏(android)等等

    Java反射机制的原理及在Android下的简单应用

    在Java中的反射机制,被称为Reflection。(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了。)它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。Reflection机制允许程序在正在...

    Java反射以及在Android中的特殊应用

    关于反射,一般书上的定义是这样的:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的...

    Java 发射机制

    这个demo主要讲解了java 的反射机制,lib包可以调用主工程里面的类,希望可以帮助需要的同学.

    MyReflectionTest:学习android反射机制

    MyReflectionTest 学习android反射机制

    Java反射的简单使用

    先来一些不太实用的解释:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java...

    一文了解JAVA反射(超详尽!)

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能就是Java语言的反射机制.简单来说,就是...

    java和android 通用的rsa 加密封装 .zip

    在android中采用java的填充算法 可以和ios .net跨平台使用 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere...

    AES-Java-iOS-Android.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

Global site tag (gtag.js) - Google Analytics