java高级-反射
- 编译时vs运行时区别
- 什么是反射
- class类
- 反射的运用
- android中的反射的运用
1.编译时vs运行时区别
编译就是java文件-》class文件
运行时就是执行class文件的过程
1.
编译时:将java代码编译成.class文件的过程。 这里只纠正我们的语法,不涉及内存的任何操作
运行时:就是java虚拟机执行.class文件的过程
编译时类型和运行时类型
编译时类型:编译时类型由申明该变量时使用的类型决定
运行时类型:运行时类型由实际赋给该变量的对象决定
Animal animal = new Dog();// 这也能体现多态
动态绑定-调用引用实例的方法
1.在编译时,是调用声明类型的成员方法(多态的实现原理),也就是所谓的编译时类型的方法
2.到了运行时,调用的是实际的类型的成员方法,也就是所谓的运行时类型的方法
3.对于调用引用实例的成员变量,无论是编译时还是运行时,均是调用编译时类型的成员变量
第三点没有理解
2.什么是反射
在运行状态中,(java反射的前提条件,获取到.class文件)
对于任意一个类,都能够知道这个类的所有属性和方法。
对于任意一个对象,都能够调用它的任意一个方法和属性
3.class类
.class文件,每一个.class文件都有一个class的对象(Class对象)
当生成一个.class文件就会产生一个Class对象,是用来表示这个类的类型信息的
4.反射的运用
1.class获取的方法
图:
三种:
1.new一个对象,通过对象的 getClass方法 获取Class对象
Person person = new Person();
Class<? extends Person> personClass01 = person.getClass();
2.try catch里头
Class<?> p02 = Class.forName("完成路径");
3. p3 = Person.class
使用场景
1,通过Class对象获取它的包名和类名
2. 通过反射机制创建类对象(最常用),反射创建一定要有无参的构造函数。clazz.newInstance();
3.
4.开源框架中用的多,通过反射机制可到一个类的构造函数,然后实现被创建带参的对象
Class.forName("xx");
Constructor<?>[] constructors = class1.getConstructors();
person1 = (Person)constructors[0].newInstance();
person2 = (Person)constructors[1].newInstance(29,"yyc");
5.通过java的反射机制来调用类的方法(常用)
clazz = Class.forName("xxx");
Method method = clazz.getMethod("fly");
method.invoke(clazz.newInstance())
Method method = clazz.getMethod("smoke",int.class);
method.invoke(clazz.newInstance(),100);
5.android中的反射的运用
开源框架
-hide
framework层使用l
1.通过原始的java反射机制的方式调用资源
图;
2.Activity的启动工程中Activity的对象的创建
classLoader.loadClass(className).newInstance();
清单文件中注册的activity、service也是通过反射完成
xml中的TextView标签等 也是通过反射创建对象到java内存中
图
图
图
图
图
图
图
图
图
图
图