Java进阶 - 反射

395 阅读2分钟

反射

  • 定义: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的实例。