引子: 先思考一下我们如何使用java中的类?
已知一个类的类名、以及、类中的方法属性、构造方法等使用new关键字创建对象使用对象调用方法或属性
问题: 如果仅仅知道一个类的类名,能否动态得到类的定义信息,包括哪些方法, 属性等?
答案:结果是当然可以,这就是我们需要谈到的反射机制。
java反射的概念和作用
java反射相关的API
关于class类
Class类是java反射的基础,通过Class类就可以得到这个类的基本信息
获得Class类的三种方式如图
首先创建了User类和Car类
方式一:通过Class.forName()方法将model.User包中的类以字符串的形式赋值
方式二:直接通过User.class;类名加class即可获得
方式三:通过这个对象的getClass()方法即可获得这个class类.
获得了class类如何知道类中的东西
1.构造方法(Constructor)
如图中所示,这是拿到了class这个类之后,通过这个类就可以用getConstructor拿到构造方法,注意构造方法也是一个对象,通过构造方法可以创建这个类的Object对象,对其的构造方法(有参无参私有不私有)都可以进行访问。
2.属性
如图中所示,这是拿到了class这个类之后,通过这个类创建这个对象,再通过这个类创建这个属性集合,将所有属性放进去后增强for循环遍历。这里我们模拟mybatis框架查询数据并赋值,这里我们先给name和password属性赋值,遍历出来的属性用setAccessible(true)可以修改私有属性,然后通过这个属性set(创建的这个对象,map找到这个属性名)为这个对象的属性进行了赋值操作,mybatis就可以通过select语句将查询出来的值,通过反射自动创建一个对象并给他赋值。
3.方法
如图中所示,拿到了class类之后就可以创建一个对象,通过这个class类就能拿到类中的方法,然后使用。
反射优缺点
总结
我们通过反射就可以拿到这个类中的所有属性、所有构造方法、所有成员方法,并且还可以创建一个对象,通过反射为这个对象中的所有属性、构造方法、成员方法进行赋值。