获取Class对象的方式
- 通过Class类的forName(String className)静态方法
- 调用类的class属性,即:类名.class
- 同过类的实例调用getClass()方法
反射的功能
- 通过反射可以获得类的类类型,也就是类的Class对象,通过该Class对象,可以获取该类的变量,构造器,方法,被标注的注解
- 通过反射,可以获取对象在运行时实际的类类型
《重构》里描述过:面向对象程序的一个最明显特征就是:少用switch(或case)语句,从本质上说,switch语句的问题在于重复。你常会发现同样的switch语句散布于不同地地点。如果要为它添加一个新的case子句,就必须找到所有的switch语句并修改它们,面向对象中的多态概念能可为此带来优雅的解决方案。多态最根本的好处就是:如果你需要根据对象的不同类型而采取不同的行为,多太使你不必编写明显的条件表达式
- 使用反射和多态可以替代switch,每个case对应一个子类,方法重载实现不同的处理,通过forName(String classNmae),反射创建类实例调用方法进行处理。这样swhich语句中每个case下面的处理都分到了一个类中
反射操作
- 创建对象
- Class对象调用newInstance()方法使用类的无参构造器创建类的实例对象
- 先获取构造器Constructor对象,再用Constructor对象的newInstance()方法来创建实例对象
- 调用方法
- Class对象获取某个方法的Method对象,Method对象调用invoke()方法执行方法函数
- Object invoke(Object obj, Object… args):obj是实际执行该方法的对象,args是运行方法需要的参数