引子: 先思考一下我们如何使用java中的类?
已知一个类的类名、以及、类中的方法属性、构造方法等 使用new关键字创建对象 使用对象调用方法或属性
问题: 如果仅仅知道一个类的类名,能否动态得到类的定义信息,包括哪些方法, 属性等?
答案:结果是当然可以,这就是我们需要谈到的反射机制。
java反射的概念和作用
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个 类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个 方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为 java语言的反射机制。(简而言之就是可以知道这个类的任何东西)java反射相关的API
Class 类型 Constructor 构造方法 Method 方法 Field 属性 除了Class外,其他类都位于java.lang.reflect包中 可见,反射API将类的类型、方法、属性都封装成了类,其中最重要的类是 Class,可以说,反射的使用都是从Class开始。关于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.方法
● getName:获得方法名字 ● getParameterTypes:获得方法参数类型如图中所示,拿到了class类之后就可以创建一个对象,通过这个class类就能拿到类中的方法,然后使用。
反射优缺点
优点: 1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作 2.提高代码的复用率,比如动态代理 3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用 缺点: 1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低 2.使用反射技术通常要在一个没有安全限制的程序运行. 3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象 性总结
我们通过反射就可以拿到这个类中的所有属性、所有构造方法、所有成员方法,并且还可以创建一个对象,通过反射为这个对象中的所有属性、构造方法、成员方法进行赋值。