Android打怪升级之旅

02、反射是什么?——《Android打怪升级之旅》

2021-04-26  本文已影响0人  老匡话Android

感谢大家和我一起,在Android世界打怪升级!

反射在平时开发中使用几率较小,但在各大框架中会频繁使用(比如:老版本ButterKnife使用注解与反射初始化控件等,省略findViewById),如果有意向成为架构师,这块知识的掌握必不可少。

一、反射是什么

平时开发中创建对象都是通过 new 关键字创建,通过该对象的实例,可以获取该对象的可访问成员变量或者调用可调用方法,此时我们明确知道使用的类是什么。

那如果我们不知道要初始化的类是什么,就需要使用到JAVA为我们提供的反射API了。

1.1 定义

反射可以在程序的运行时

这种动态获取程序信息以及动态调用对象的功能称为反射机制。反射是JAVA被视为动态语言的关键。

1.2 原理

在运行时获取到类,但是在运行时.java文件已经在编译阶段被编译成了.class文件,所以反射的原理就是:运行时通过字节码文件获取到类的所有信息

1.3 优缺点

优点:

缺点:

二、反射的使用

Class类中方法特别多,我们只以举例的方式写几个常用的例子,大家只需记住通过反射可以获取一个类中所有的成员变量和方法(无视权限),你想要的全都有

2.1 运行时获取类

从1.2章节反射的原理可以晓得,反射的使用需要先在运行时获取到类,运行时获取到类一共有四种方法,根据情况选择:

最终这四种方式获取的Class都是相同的。

// 以下结果都是true
System.out.println(fruitClass1 == fruitClass2);
System.out.println(fruitClass2 == fruitClass3);
System.out.println(fruitClass3 == fruitClass4);

2.2 运行时创建对象

通过在2.1中获取的Class类来创建对象。

// 在2.1中拿到的Class类
Class<Fruit> fruitClass = Fruit.class;

// 调用Class类中的方法创建对象
Fruit fruit = fruitClass.newInstance();

2.3 获取构造方法

一个类的构造方法因为参数不同可以很多,所以有API可以直接获取所有构造方法 或者 根据参数不同获取某个构造方法

// 带有四个构造方法的类
public class Fruit {

    public String name;
    private int type;
    
    public Fruit() {
    }

    public Fruit(String name) {
        this.name = name;
    }

    public Fruit(int type) {
        this.type = type;
    }

    public Fruit(String name, int type) {
        this.name = name;
        this.type = type;
    }
}

2.4 获取类的所有方法

和获取构造方法类似,有获取所有方法和单个方法的API,但是有两套供选择,注意注释的方法限制。

2.5 获取类的成员变量

和获取方法基本一致,也有两套,可以给变量赋值和取值,都是基于对象的。

总结

最后咱们再总结一下反射的知识点:

  1. 反射可以在程序的运行时,构造任意一个类的对象、了解任意一个对象所属的类、了解任意一个类的成员变量和方法、调用任意一个对象的属性和方法
  2. 反射的原理是:运行时通过字节码文件获取到类的所有信息
  3. 反射的优点是自由度高,可以无视访问权限限制。缺点是性能差、安全性差(破坏了类的封装性)。
  4. 反射需要先在运行时得到类,有四种方式,得到类之后可以了解其中的方法和成员变量。
  5. 反射中对方法的调用、成员变量的取值和赋值,都是基于对象进行操作。

这样反射的介绍就结束了,希望大家读完这篇文章,会对反射有一个更深入的了解。如果我的文章能给大家带来一点点的福利,那在下就足够开心了。

下次再见!


上一篇 下一篇

猜你喜欢

热点阅读