1 、 反射的定义 : Reflect 就是把Java类的各个成分 映射成一个个java 对象。在运行状态中, 对于任意一个类,突出任意类。 能够得到这个类的属性和方法。 这种动态获取信息以及动态调用对象的方式叫做java 的反射机制。
2 、反射机制的功能:
1 、运行时判断一个对象所属的类: 正常的时候 我们用 instanceof 来判断 对象是否属于某个类。 有的时候, 类 继承一个父类,不能严格判断出是自己的类,而不是父类。 根据下图 所示 不能判断是 父类 还是子类
所以需要 调用队形的 getClass 方法 ,和 具体的 Class 进行对比,来判断是否 是相同的。o.getClass().equals(ClassA.class)
2 、 运行时构造一个对象 。
构建对象的有三种方式 : new 反序列化 拷贝 然后就是反射
1 、Class.formName 、Object.class obj.getClass 来获取class 对象
newInstance 可以创建一个不带参数的对象。可以通过构造方法来创建一个对象
2 、创建接口的对象。 Retrofit 通过动态代理的方式来创建对象
3 在运行的 获取任意 一个类所具有的成员 和方法 。
4 在运行的时候调用 任意一个对象的方法。
5 生成动态代理。
解决的问题,1 访问一些framework的变量或者调用方法,在没有依赖包的时候,可以正常编译运行。2 运行时,获取进程中单例对象,通过使用单例对象来进行处理.比如启动界面,热修复dex包的使用。3 启动Activity , ActivityThread main 不是 一个Thead ,继承ClientTransactionHandler 。 ApplicationThreadextends IApplicationThread.Stub bindApplication startActivityNow ————》performLaunchActivity
最终启动
handleApplicationInfoChanged----》scheduleRelaunchActivity ---》case RELAUNCH_ACTIVITY:handleRelaunchActivityLocally((IBinder) msg.obj); ----》handleRelaunchActivity --》handleRelaunchActivityInner-》handleLaunchActivity ---》handleLaunchActivity---》performLaunchActivity
实现反射的类 : Class Method Constructure Array
4 反射的使用
PO 对象是复杂的对象 可以和 数据库进行 映射 POJO plain old java Object 简单的对象(简单的构造方法 和 get set 方法);
1 、 copy 一个对象的所有属性 object
//通过默认构造方法创建一个新的对象
Object objectCopy=classType.getConstructor(newClass[]{}).newInstance(new Object[]{});
//获得对象的所有属性15Field fields[]=classType.getDeclaredFields();
//调用原对象的getXXX()方法33Object value=getMethod.invoke(object,new Object[]{});
5 、自己写的案例