Java-面试-基础-2-反射

什么是反射

运行时分析类以及执行类中方法的能力。

通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

优缺点

优点:灵活,框架,运行时分析操作类

缺点: 安全问题,无视泛型的参数的安全检查(编译时),性能问题

应用场景

  1. 开发通用框架
  2. 动态代理
    1. JDK 代理
    2. GGLIB 代理
  3. 自定义注解
  4. 访问私有成员

实际使用

获取 class 对象

  1. <className>.class

  2. Class.forName("<path>")

  3. <objectName>.getClass()

  4. ClassLoader.loadClass("<path>")

1. 知道具体类的情况下可以使用:

1
Class alunbarClass = TargetObject.class;

但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取 Class 对象,通过此方式获取 Class 对象不会进行初始化

2. 通过 Class.forName()传入类的全路径获取:

1
Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

3. 通过对象实例instance.getClass()获取:

1
2
TargetObject o = new TargetObject();
Class alunbarClass2 = o.getClass();

4. 通过类加载器xxxClassLoader.loadClass()传入类路径获取:

1
ClassLoader.getSystemClassLoader().loadClass("cn.javaguide.TargetObject");

通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行。

反射的基本操作

  1. 你得先有一个需要反射得到的类
  2. 获取类对象并创建实例
  3. 获取其中的所有方法
  4. 获取指定方法并且掉哟个(invoke
  5. 获取指定参数并对参数进行修改
  6. 调用 private 方法,需要先取消安全检查