`
gjhappyyy
  • 浏览: 255635 次
  • 性别: 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、使支持插件资源文件中直接引用依赖库中的资源。目测可能需要重写...

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

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

    Ferryman:Android页面路由跳转框架

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

    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 ...

    举例讲解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