Android基础难点-反射

226 阅读2分钟

什么是反射
运行过程中,能获取类的方法、属性、参数,能获取对象的方法并调用和属性并做操作,这种行为就是反射

为什么有反射(反射用来解决什么问题)
1、需要在运行过程中创建对象,比如Activity就是通过activity配置在manifest里面的全类名创建的,比如LayoutInflate解析xml以后也是通过反射生成对应的控件 2、需要运行时调用对象的私有方法或者属性

反射在运行中创建对象的本质是什么
通过类全路径(com.xxx.xxx.XXActivity)找到虚拟机方法区加载的的Class内容,在堆区域创建这个Class的实例

加载在虚拟机方法区的Class内容是什么
就是.Class文件的二进制编码,是即时编译器编译后的代码,也就是汇编语言。 里面有一个指向Class实例的引用,这个是类加载的过程中,虚拟机会(在堆中)创建该类型的Class实例,方法区中必须保存对该对象的引用。通过Class.forName(StringclassName)来查找获得该实例的引用,然后创建该类的对象。

什么是符号引用什么是直接引用
背景知识1:String s = "abc"在编译阶段,s会被解析成符号引用 背景知识2:String s = "abc在运行阶段,s会被解析成直接引用 符号引用就是一串编码,在编译期间,虚拟机并不知道s在堆里的地址,因为此时还没有被加载到内容中,所以使用一串编码作为这个类的唯一标识

反射调用对象私有属性和方法的本质是什么
通过类全路径找到虚拟机方法区的class内容,通过Field类或者Method类获取实例里面的属性和方法并处理

反射相关代码为什么执行的慢
虚拟机在运行时,JIT编译器会将热点代码转成字节码加快执行速度 反射的代码无法被JIT编译器优化 同理,AOT受反射的影响更大 但是并不是ART的反射比Dalvik快”,是ART整体都比Dalvik快,所以ART下的反射看起来也快了