10.12java中国的反射

java高级-反射

    1. 编译时vs运行时区别
    1. 什么是反射
    1. class类
    1. 反射的运用
    1. 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 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内存中

你可能感兴趣的:(10.12java中国的反射)