Android反射基础
16lz
2021-01-26
最近在看一些android插件化方面的代码,一般都会用到java最基本的反射功能。原来也大概知道怎么用,但是一直没有系统的整理和实践过。借此机会,将基本的反射总结记录一下
Android的ClassLoader的结构
1437930-bb9d359f4c7e9935.png
DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent)
dexPath the list of jar/apk files containing classes and resources ----- apk、jar包或者解压后的apk所在的路径,不能为空
optimizedDirectory directory where optimized dex files should be written; must not be null------解压后的dex文件存放的路径,不能为空,一般都放在程序的私有目录,防止恶意代码的注入
libraryPath the list of directories containing native libraries; may be null------so库存在的目录
parent the parent class loader ----- 父加载器
反射基础:
DynamicTest类,举例
public class DynamicTest implements IDynamic{ public DynamicTest() { // TODO Auto-generated constructor stub Log.e("kaka", "DynamicTest init"); } public DynamicTest(String word){ Log.e("kaka", "DynamicTest init " + word); } @Override public String helloWorld(String word) { // TODO Auto-generated method stub return "hello " + word; } protected String helloWorld() { // TODO Auto-generated method stub return "hello "; } private String helloWorld(String word,int index) { // TODO Auto-generated method stub return "hello " + word + index; } public static String helloWorld(String word){ return "static " + word; }}
构造函数
DexClassLoader mClassLoader = new DexClassLoader(optimizedDexOutputPath.getAbsolutePath(),getApplication().getCacheDir().toString(),null,getClassLoader());Class libClass = mClassLoader.loadClass("com.example.DynamicTest");
带参数的构造函数
Constructor constructor = libClass.getConstructor(String.class); Object instance = constructor.newInstance("constructort");
私有方法
Method simpleMethod = libClass.getDeclaredMethod("helloWorld"); simpleMethod.setAccessible(true); //私有方法需要设置为true,才能调用 String str = (String)simpleMethod.invoke(instance,"haha");
带参数的方法
Class[] param = new Class[1]; param[0] = String.class; Method simpleMethod = libClass.getDeclaredMethod("helloWorld",param); //带参数的方法
静态方法
Method method = libClass.getDeclaredMethod("staticString",String.class); //通过class类直接获取静态方法 Log.e("kaka",(String) method.invoke(null,"kaka")); //静态方法,不用传实例对象,直接传null
以上只是简单介绍了基本的用法,其中其他获取Field(成员)的方法都差不多。
更多相关文章
- Android(安卓)实现自定义属性 declare-styleable扩展 方法 &Ecli
- Android学习笔记(十二)——数据存储(SQLite数据库)
- android JNI入门 之helloworld
- Android中的EditText默认时不弹出软键盘的方法
- Android中文API(127) ―― MessageQueue
- Android(安卓)失去焦点,关闭弹出的软键盘
- Android(安卓)Studio 如何快速添加override或者implements方法
- Android(安卓)studio虚拟机adb环境配置
- Android(安卓)Mms专题之:Android短彩信收发流程(Framework)