简单的记录下Android 中和反射相关的一些心得。
Java 反射技术
- 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。在计算机科学领域,反射是一类应用,它们能够自描述和自控制。这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
- 反射机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在执行的过程中,动态生成Instances、变更fields内容或唤起methods。
- 自己写了一些简单的示例代码。方便用的时候直接拷贝
https://github.com/weijianfeng/wheels/tree/master/Reflection
Android 反射技术
- 反射在android中的应用
- 通过反射技术可以访问到其他包名下数据方法等, 插件化,主题皮肤更换等
- 通过反射,拿到其他apk中的类,R文件,资源ID类等,然后进行使用。
- 示例
http://blog.csdn.net/tangnengwu/article/details/22801107
http://blog.csdn.net/t12x3456/article/details/39958755/
- 访问android 隐藏的API
- 方法getDeclaredMethods()获取到由当前类定义的所有方法
- 对于源码中部分没有对外暴露的方法,可以强行调用
- 修改某些“不可改” 的系统资源
- 通过反射一步步拿到靠近底层的类,进而对一些系统设置进行修改
- 示例
https://github.com/weijianfeng/jnasockopt
http://androidxref.com/6.0.1_r10/xref/libcore/luni/src/main/java/libcore/io/Os.java
- 通过反射技术可以访问到其他包名下数据方法等, 插件化,主题皮肤更换等
Android 使用反射的缺陷
- 因为是动态执行的,效率自然没有预编译时引用现有的库效率高,对于一些复杂的涉及Java自动类型转换判断,执行时间可能是直接引用的上千倍,所以最终我们调试时必须考虑性能问题。
- 因为反射是动态的,所以需要处理很多异常,不然Dalvik崩溃出Force Close的概率会大很多,很简单的一个反射就需要至少3个异常捕获,本身try-catch效率就不是很高,自然进一步影响运行效率
- 统计数据
http://blog.nimbledroid.com/2016/02/23/slow-Android-reflection-zh.html