反射

1. 概述

反射是框架设计的灵魂,反射最大程度破坏了面向对象的封装特性

正常方式:引入需要的“包类”名称通过new实例化取得实例化对象

反射方式:实例化对象getClass()方法得到完整的“包类”名称

反射的优缺点:

  • 优点:可以实现动态创建对象和编译
  • 缺点:对性能有影响,执行速度相对于正常方式较慢

2. Class类

2.1 获取Class实例

  1. //方法一:通过对象获得
  2. Class c1 = person.getClass();
  3. //方法二:通过forName获得
  4. Class c2 = Class.forName("com.falsche.reflection.Student");
  5. //方法三:通过类名.class获得
  6. Class c3 = Student.class;
  7. //获得父类类型,getSuperclass()
  8. Class c4 = c1.getSuperclass();

2.2 Class对象功能

  1. 获取成员变量
    1. getField(String name); //获取指定public变量
    2. getFields(); //获取public变量
    3. getDeclaredField(String name); //获取指定变量(public, private)
    4. getDeclaredFields(); //获取所有变量


Field:成员变量

  • 设置值
    1. void set(Object obj, Object value)
  • 获取值
    1. get(Object obj)
  • 忽略访问权限修饰符的安全检查
    1. setAccessible(true); //暴力反射
  1. 获取构造方法
    1. getConstructor(); //获取指定public构造方法
    2. getConstructors(); //获取public构造方法
    3. getDeclaredConstructor(); //获取指定构造方法(public, private)
    4. getDeclaredConstructors(); //获取所有构造方法


Constructor:构造方法

  • 创建对象:

    • 有参构造方法
      1. Constructor constructor = userClass.getConstructor(int.class, String.class);
      2. constructor.newInstance(1, "acdc");
  1. -

无参构造方法

  1. userClass.newInstance();
  1. 获取成员方法
    1. getMethod(); //获取指定名称的public方法
    2. getMethods(); //获取public方法(包含父类)
    3. getDeclaredMethod(); //获取指定名称的方法(public, private)
    4. getDeclaredMethods(); //获取本类的所有方法


Method:成员方法

  • 执行方法:method.invoke()
    公有构造方法时:
    1. Method method = userClass.getMethod("toString");
    2. User user = new User();
    3. Object user = userClass.newInstance();
    4. method.invoke(user); //执行方法


私有构造方法时:

  1. Constructor c = userClass.getDeclaredConstructor();
  2. c.setAccessible(true);
  3. Object user = c.newInstance();
  4. Method method = userClass.getDeclaredMethod("toString");
  5. method.invoke(user); //执行方法
  • 获取方法名称:
    1. getName()
  1. 获取类名
    1. getName()