反射
-
定义:Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
-
简单来说,反射就是可以在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成的对象。
获取Class的方式
在Java中万事万物皆对象,每次创建一个对象,都会把它封装成java.lang.Class对象,在单一ClassLoader加载的情况下,一个类new出的多个对象对应在jdk内是同一个class文件(虚拟机在创建对象的时候会先去看这个类是否被加载过,如果没有加载过,它会先去创建这个class),它里面会保存这个类的一些信息:元数据、Field、Constructor、Mrthod..等。我们可以通过反射来获取这些成员,进行调用。
获取Class对象的3中方式:
- Class personClass1 = Person.class;
- Class personClass2 = new Person().getClass();
- Class personClass3 = Class.forName("类的全限定名,如果是内部类要用到$符号");
获取对象的3中方式:
- Person p1 = new Person();
- Person p2 = (Person) personClass2.newInstance();
- Person p3 = Person.class.getConstructor()获取构造器,通过构造方法创建实例。
反射使用
其实反射就是对Class,Constructor,Field,Method中的API进行使用,来获取反射拿到的对象实例,从而调用他们中的成员。
Class中的API
Constructor中的API
Field中的API
Method中的API
反射的优缺点
优点:
- 可以直接获取类的内部信息,并且访问
- 可以创建和控制任何类
- 扩展性,降低耦合度
缺点:
- 反射的运行速度远远慢与直接使用实例的速度
- 降低可移植性,因为涉及到要了解反射类的内部情况,所以在维护以及版本兼容的上有很大问题
- 安全性问题
使用场景
- 在一些框架中,比如Retrofit需要传入一个Bean对象然后将json转换成传入的Bean对象来返回给你,那么它想要根据你想要的返回,就要通过反射获取你传入Bean的实例。