`
gjhappyyy
  • 浏览: 259528 次
  • 性别: 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 反射注解框架

    在Android开发中,注解通常用于简化生命周期管理、依赖注入、数据验证等场景。在这个"android 反射注解框架"中,注解被用来标记视图组件,以便于后续的自动化处理。 反射是Java提供的一种能够在运行时检查类、接口...

    android 反射机制 简单示例

    下面是一个简单的Android反射机制示例: 首先,定义一个简单的类`Person`,包含一个私有字段`name`和一个私有方法`sayHello()`: ```java public class Person { private String name; private void sayHello()...

    Android 通过反射启动未安装的APK中的Activity

    在使用反射启动未安装APK的Activity时,开发者必须谨慎行事,确保符合Android的安全规范,避免潜在的漏洞和风险。通过深入学习和实践,开发者可以掌握这一高级技术,为复杂的应用场景提供解决方案。

    Android反射的使用demo

    二、Android反射的应用场景 1. 动态加载:当需要在运行时根据用户选择加载不同的模块或库时,反射是理想的选择。 2. 接口处理:如果第三方库没有提供接口,但其内部类或方法可以满足需求,反射可以帮助我们直接调用...

    android系统java反射机制详解

    三、Android中反射的应用场景 1. 动态加载组件:在AndroidManifest.xml中,我们可以在运行时动态决定要加载哪个Activity或Service。 2. 操作私有成员:有时我们需要访问或修改私有成员,反射提供了解决方案。 3. 第...

    android 使用反射机制操作数据库 插入 查询

    通过上述方法,我们可以灵活地使用反射机制来操作Android的SQLite数据库,实现插入和查询功能。这种方法对于处理动态数据模型或者需要高度自定义SQL操作的场景特别有用。在进行实际开发时,应当结合具体情况,权衡...

    Android-FreeReflection一个允许你在AndroidP上使用反射而没有任何限制的库

    FreeReflection库通过绕过Android P的反射限制,提供了一种安全、高效的方式来使用反射。它使用了类加载器技巧,动态地加载并访问所需的类,使得开发者可以在不修改原有代码的情况下,恢复在Android P上的反射功能...

    Android-使用反射和aidl实现的电话拦截功能的demo可以自己修改要拦截的归属地

    本示例"Android-使用反射和aidl实现的电话拦截功能的demo"提供了一个利用反射和Android Interface Definition Language (AIDL)来拦截电话的解决方案。下面将详细介绍这个项目中的关键技术点。 1. **反射(Reflection...

    Android 下通过反射调用加载/卸载(mount/unmount) 外置SD卡

    在Android系统中,外置SD卡的加载与卸载通常由系统服务自动处理,但有时开发者可能需要在特定场景下进行手动操作,例如在应用程序中实现数据备份或系统优化功能。这种情况下,可以通过反射调用来执行加载(mount)和...

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

    - **处理隐藏API**:如文中提到的,Android SDK中部分API被标记为隐藏(@hide),通过反射机制可以访问这些API,从而解决某些特定场景下的需求。 - **热修复**:利用反射机制实现代码的热更新,无需重新安装应用程序...

    Android 反射注解与动态代理综合使用详解

    在Android开发中,反射、注解和动态代理是三个非常重要的高级特性,它们极大地提高了代码的灵活性和可维护性。接下来我们将深入探讨这三个概念以及它们的综合应用。 反射(Reflection)是Java提供的一种机制,允许...

    反射获取Context的实例

    在Android开发中,反射是一种强大的编程技术,它允许我们在运行时检查和操作类、接口、字段和方法。本文将深入探讨如何通过反射获取`Context`的实例,并展示如何利用反射实现一个集成`Toast`的工具类。这在某些场景...

    android java反射,通过图片名获取图片

    在给定的场景中,“android java反射,通过图片名获取图片”这个主题涉及到利用反射机制来动态地加载和使用资源图片。下面将详细阐述这一知识点。 首先,我们需要理解Java反射的基本概念。Java反射是Java语言提供的...

    Android反射完全解析--强势来袭

    "Android反射完全解析--强势来袭"这个主题深入探讨了如何利用Java的反射机制来增强Android应用的功能和灵活性。反射使得我们能够在程序运行过程中动态地获取类的信息,并能调用私有方法,访问私有变量,甚至执行不...

    玩转反射demo

    在这个博客文章中,作者android_ku_ku详细解释了反射的概念,并提供了一个具体的代码示例来帮助理解。 反射的核心概念在于,它允许程序在运行时动态地获取类的信息,如类名、属性、方法等,并可以实例化对象、调用...

    Android5.1以太网开关控制以及动静态IP设置

    为了保证兼容性和稳定性,开发者应当尽可能使用公开API,并在必要时使用反射调用隐藏API。同时,为了遵循最佳实践,应在应用中加入详细的日志记录和异常处理,以便在出现问题时能快速定位和解决。

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

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

    MyReflectionTest:学习android反射机制

    在Android开发中,反射机制是一种强大的工具,它...以上是关于Android环境中Java反射机制的一些核心概念和使用方式。通过"MyReflectionTest"项目,你可以实践这些知识点,加深对反射的理解并掌握其在实际开发中的应用。

    通过反射调用静态方法

    本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至关重要的。在Java中,反射API(java.lang.reflect)允许我们获取类的信息,包括类名、构造函数、方法...

    android以太网设置Demo(可运行,但仅提供思路哦,包含所需的framework.jar)

    总的来说,实现Android设备的以太网设置涉及对系统框架的深入理解和使用反射技术。这是一个高级主题,通常只适用于系统开发者或对Android底层有深厚了解的开发者。如果你正在寻求为你的Android设备添加以太网功能,...

Global site tag (gtag.js) - Google Analytics