Granda's Blog

JAVA:反射

获取Class对象的方式

  • 通过Class类的forName(String className)静态方法
  • 调用类的class属性,即:类名.class
  • 同过类的实例调用getClass()方法

反射的功能

  • 通过反射可以获得类的类类型,也就是类的Class对象,通过该Class对象,可以获取该类的变量,构造器,方法,被标注的注解
  • 通过反射,可以获取对象在运行时实际的类类型

    《重构》里描述过:面向对象程序的一个最明显特征就是:少用switch(或case)语句,从本质上说,switch语句的问题在于重复。你常会发现同样的switch语句散布于不同地地点。如果要为它添加一个新的case子句,就必须找到所有的switch语句并修改它们,面向对象中的多态概念能可为此带来优雅的解决方案。多态最根本的好处就是:如果你需要根据对象的不同类型而采取不同的行为,多太使你不必编写明显的条件表达式

  • 使用反射和多态可以替代switch,每个case对应一个子类,方法重载实现不同的处理,通过forName(String classNmae),反射创建类实例调用方法进行处理。这样swhich语句中每个case下面的处理都分到了一个类中

反射操作

  • 创建对象
    1. Class对象调用newInstance()方法使用类的无参构造器创建类的实例对象
    2. 先获取构造器Constructor对象,再用Constructor对象的newInstance()方法来创建实例对象
  • 调用方法
    1. Class对象获取某个方法的Method对象,Method对象调用invoke()方法执行方法函数
    2. Object invoke(Object obj, Object… args):obj是实际执行该方法的对象,args是运行方法需要的参数