一般反射:
Class cls = xx.class //获取class 对象
Object o = cls.newInstance(); //得到实例
Method method = o.getxxMethod(); //获取方法,有参数或者无参数
method.invoke(o,xx);//调用
如果不在同一包中 则需要进行设置
try {
Class testClass = Class.forName("utils.TestClass1"); //全类名,获取实例
Constructor testClassConstrutor = testClass.getDeclaredConstructors()[0]; //获取构造方法
testClassConstrutor.setAccessible(true);//设置可访问权限
Object test = testClassConstrutor.newInstance();//得到实例
Method printMethod = testClass.getDeclaredMethod("printName");//获取方法
printMethod.setAccessible(true); //设置方法可调用
printMethod.invoke(test); //调用
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException |
ClassNotFoundException e) {
throw new RuntimeException(e);
}
Java设置安全访问 safety 本身 而不是security
Android 9 开始限制反射调用系统内部API
ClassLoader:
依靠虚拟机读取class 文件,然后交给操作系统进行交互,从字节码转为机器码
ClassLoader 执行类时,解读字节码,每个类都是通过classloader加载出来的,虚拟机会创建第一个根classloader,然后根load加载其他的Classloader
.dex class文件打包的集合
odex optimized 操作系统进行简单优化后的dex,比如优化cpu指令集等,让它更符合当前操作系统
oat optimized Android File Type 被优化的安卓文件类型,转为机器码 = AOP Ahread - of Time com
DexClassLoader / PathClassLoader 加载dex的class
插件化:从宿主APP加载插件APP的类,一般不能打开插件的activity,可以打开fragment
Android 9 以后会更加严格,通过反射修改Activity,然后修改Activity的mInstrumentation,它会执行execStartActivty,然后跳过验证,跳过验证是否注册过的
插件化是模块化的一种实现方式,主要用于动态部署,以及热修复
最早用于dex 超过6535方法的限制
可以减少安装包的大小
Android APP Bundles /技术 可以拆分进行不同的包,并不是动态部署,而是拆分打包