`
gjhappyyy
  • 浏览: 255951 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

android 反射的使用场景

阅读更多

【转】http://mysuperbaby.iteye.com/blog/1458966

在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的一段代码:

Java代码  收藏代码
  1. public class SharedPreferencesCompat {  
  2.   
  3.     private static final Method sApplyMethod = findApplyMethod();  
  4.   
  5.     private static Method findApplyMethod() {  
  6.         try {  
  7.             return SharedPreferences.Editor.class.getMethod("apply"new Class[0]);  
  8.         } catch (NoSuchMethodException e) {  
  9.             return null;  
  10.         }  
  11.     }  
  12.   
  13.     public static void apply(SharedPreferences.Editor editor) {  
  14.         if (sApplyMethod != null) {  
  15.             try {  
  16.                 sApplyMethod.invoke(editor, new Object[0]);  
  17.                 return;  
  18.             } catch (IllegalAccessException e) {  
  19.             } catch (InvocationTargetException e) {  
  20.             }  
  21.         }  
  22.         editor.commit();  
  23.     }  
  24. }  

 

2. 使用私有的API

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

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

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

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

Java代码  收藏代码
  1. private static final String AMR_INPUT_STREAM_CLASS = "android.media.AmrInputStream";  
  2.   
  3. private static Class<?> getAmrInputStreamClass() throws ClassNotFoundException {  
  4.     return Class.forName(AMR_INPUT_STREAM_CLASS);  
  5. }  
  6.   
  7. private static InputStream createAmrInputStream(InputStream in) {  
  8.     try {  
  9.         Class<?> clazz = getAmrInputStreamClass();  
  10.         Constructor<?> constructor = clazz.getConstructor(new Class[] { InputStream.class });  
  11.         return (InputStream)constructor.newInstance(new Object[] { in });  
  12.     }   
  13.     ...  
  14. }  

 

分享到:
评论

相关推荐

    Android获得设备状态信息、Mac地址、IP地址的方法

    在APP开发时,经常会遇到要获取手机状态信息的场景,像升级时获取版本号,像发生异常时要收集手机信息等等。有些软件还要根据Mac地址来判定当前用户以前是否登录过。下面将一一介绍获取这些手机状态信息的方法。 1 ...

    通过反射调用静态方法

    本例演示了如何使用反射,调用类的静态方法,封装了工具类ClsTool,统一实现静态方法的调用。使用反射,在特定场景下,能够很好的简化代码。例如mybatis

    QsBase:Android AOP面向切面框架,使用场景:

    QsBase的基于AOP面向切面编程的Android高效开发框架(transform + javassist) MVP(或MVVM)架构+ AOP面向切面编程,替代弃反射,代理等操作,稳定性和执行效率高积累很多框架封装思想,能够轻松驾驭任何典型的APP...

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

    以下是自己使用反射的两个地方,感兴趣的同学可以看下:Android okHttp网络请求之Json解析,Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现。  什么是Java反射机制?  JAVA反射机制是在...

    Android特殊安全技巧

    在自然界中,光源发出的光线向前传播,最后到达一个妨碍它继续传播的物体表面,我们可以将“光线”看作在同样的路径传输的光子...其中一部分光线通过这样的途径传播到我们的眼睛,我们就能够看到最终的渲染图像及场景。

    Android插件框架Android-Plugin-Framework.zip

    毕竟这里使用了很多反射,会涉及到多机型多系统版本的兼容问题。后续还需要持续测试和完善 上述第2点问题已解决、请看已支持的功能第3条。 3、使支持插件资源文件中直接引用依赖库中的资源。目测可能需要重写...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    15.2 反射环境模拟 385 15.2.1 案例效果与基本原理 385 15.2.2 开发步骤 386 15.3 折射环境模拟 388 15.3.1 案例效果与基本原理 388 15.3.2 开发步骤 390 15.4 色散效果的模拟 391 15.4.1 ...

    swipeback-Android侧滑返回分析和实现(不高仿微信).zip

    目录示例demo功能介绍实现原理集成方式使用方式注意事项示例demoDemo下载示例效果点此下载 或扫描下面二维码功能介绍支持SDK19(Android4.4)及以上Activity的侧滑返回,同时实现沉浸式状态栏。实现原理侧滑时利用...

    Ferryman:Android页面路由跳转框架

    支持Kotlin, 支持在 Library 中使用以及模块化场景。全库没有一个反射,纯依靠 APT 实现。使用简洁直观的代码处理页面跳转:Ferryman.from(MainActivity.this) .gotoNameInputActivity(name) .onResultWithData(ne

    举例讲解Android应用开发中OTTO框架的基本使用

    使用场景 OTTO基于Observer设计模式。它有发布者,订阅者这两个主要对象。OTTO的最佳实践就是通过反射牺牲了微小的性能,同时极大的提高了程序的耦合度,更加利于MVP分工开发与维护。业务层开发者在处理资源(比如Db...

    一款Android平台的LivaData的消息总线框架

    如果对 ElegantBus 的实现过程,以及考虑点感兴趣的可以看看前几节自吹如果只是想先使用的,可以跳过,直接到跳到使用说明和常见 LivaData 实现的 EventBus 比较消息总线使用反射入侵系统包名进程内 Sticky跨进程 ...

    Android实现修改状态栏背景、字体和图标颜色的方法

    Android开发,对于状态栏的修改,实在是不友好,没什么api可以用,不像ios那么方便.但是ui又喜欢只搞ios一套.没办法.各种翻源码,写反射.真的蛋疼. 需求场景: 当toolbar及状态栏需要为白色或浅色时(如简书),状态栏由于用...

    QuJing:曲境是一个xposed模块,可实现在PC浏览器上的动态监控(hook)函数调用和查看编码信息,以及反射调用(invoke)等功能

    曲境是一个xposed模块,可实现在PC浏览器上的动态监控(hook)函数调用和查看编码信息,以及反射调用(invoke)等功能。避免了编写钩子代码的麻烦,提供了可视化的界面,对新手更友好。 实现功能 枚举安卓设备所有...

    AR-Toolbox:Core ARCore和Sceneform游乐场

    :颜色,金属,粗糙度,反射率 手势:拖动,旋转,缩放 测量:测量折线 增强图像:跟踪应用程序徽标 增强脸部:识别检测到的脸部区域 本机和Web场景查看器:本机或Web上的交互式模型 云锚:托管,共享和解析锚 Point...

    欧拉公式求圆周率的matlab代码-SwiftSpace:3D空间中由CoreMotion控制的图形

    对于每个touchesBegan(),我将在屏幕中央创建一个新的平面框,该框与相机对齐,并在touchesMoved()上,我将使用touch位置附加到要绘制到的路径上我将CAShapeLayer用作新创建的几何图形的漫反射材料。 简单的! ...

Global site tag (gtag.js) - Google Analytics