8 反射00
1 编译时 vs 运行时
编译时:将Java代码编译成.class文件的过程【只涉及纠正我们的语法正确与否,不涉及运行时,不牵扯内存】
运行时:就是Java虚拟机执行.class文件的过程【肯定会用在内存调用】
1、编译时类型和运行时类型
编译时类型:编译时类型由声明该变量时使用的类型决定
运行时类型:运行时类型由实际赋给该变量的对象决定
Animal animal =new Dog();
2、动态绑定:调用引用实例的方法
1)在编译时,是调用声明类型的成员方法(多态的实现原理),也就是所谓的编译时类型的方法
2)到了运行时,调用的是实际的类型的成员方法,也就是所谓的运行时类型的方法
3)【对于调用引用实例的成员变量】,无论是编译时还是运行时,均是调用编译时类型的成员变量
2 什么是反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
正常情况下,我们运行的所有的程序在编译期时候就已经把那个类被加载了。 Java的反射机制是在编译时并不确定是哪个类被加载了,而是在程序运行的时候才加载。使用的是在编译期并不知道的类。这样的编译特点就是java反射。
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,降低类之间的藕合性。
3 class类
.class文件
Class对象,表示这个类的类型信息
4 反射的运用
方式1【object.getClass();】
方式2【Class.forName("className");】
方式3【类名.class】
使用场景1:获取包名,获取类名
使用场景2:验证所有的类都是Class类的实例
使用场景3:通过反射创建类对象
使用场景4:通过反射得到一个类的构造函数,并实现创建带参实例对象
使用场景5:通过Java反射机制调用类的方法
5 Android中反射的运用
1)通过原始的Java反射机制的方式调用资源
2)Activity的启动过程中Activity对象的创建