Java反射
回顾java中如何使用类和对象
1.定义类
2.创建已知类的对象,明确知道要创建哪儿个类的对象new 类名(); 一切都是已知的,对于我们自己写的程序没有任何问题(业务代码) ,但是像框架,tomcat,或者一些其他的组件(Jackson 对象->json),事先不知道具体要处理那些类,只能根据配置文件中配置的类的地址决定要创建那个类.
框架要做到可以处理任何类,只要写一套处理程序即可.框架要做到以不变应万变.
问题:如果只知道类的地址,如何使用类
<select id="findstudent" parameterType="int" resulttype="com.ffyc.mybatis.model.student">
框架可以做到给他什么类名,就可以创建给定类的对象,并调用该对象的方法和属性:1.创建对象2.将查询到的结果,封装到创建的对象中(调用setxxx(),调用xxx属性)
<select id="findstudent" parameterType="int" resulttype="com.ffyc.mybatis.model.student">
如何实现写一套程序可以处理任何类
答案是:反射机制
反射机制
可以看做是一种反向使用类
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个 类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个 方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为 java语言的反射机制。
在程序运行状态中,可以动态获取类的信息,可以动态创建类的对象,可以调用对象的成员(变量,方法,构造方法)的机制称为java反射机制
1.如何获取类的信息
可以通过获取到类的class对象,然后通过class对象就可以获得类中想要的信息
2.如何获得类的Class对象
方法一: 框架中常用,只知道类的字符串地址
String s="com.ffyc.mybatis.model.student"
Class c1=Class.forName(s);
//把给定地址的类进行了加载,为期创建Class对象,通过Class对象,就可以任意获取到类中的信息
方法二:类名.class 获得类的Class对象
Class c2=Student.class;
方式三:适用的场景:已知对象,需要对任何对象进行操作
Student s=new Student();
Class c3=s.getClass();
//通过已知对象的getClass()获得该对象类的Class对象
3.获取到类的Class对象之后,如何获取类信息并操作对象中的成员?
String s="com.ffyc.mybatis.model.student"
Class c1=Class.forName(s);
object studentboject=c1.newInstance()//通过Class类的对象,创建对象
Constructor cons=c1.getConstructor();//获得类中指定的公共的构造方法 获得无参构造方法封装到一个constructor中
Object objectstudent =constructor.newInstance();//通过构造方法中newInstance()创建对象
Student s=(Student)objectstudent;
1.获取类中的构造方法信息getConstructor()
获得指定(参数个数,类型)的公共构造方法,返回constructor来表示获得到的构造方法
newinstance();创建类的对象
getConstructors() 返回所有公共的构造方法
getDeclaredConstructor()获得指定的构造方法(包含私有,受保护,默认,公共)
getDeclaredConstructors() 获得所有构造方法
2.获得成员变量
public Field getField(String name)通过指定Field名字,返回 Field实例
Field类将类的属性进行封装,可以获得属性的基本信息、属性的值,也 可以对属性进行赋值.
● getName:返回属性的名字
● set:设置属性
3.获得方法
● Method实例都是通过Class类的方法获得
● Method getMethod(String name, Class… parameterTypes) : 通过指定方法名,参数类型,返回一个Method实例
● Method类将类中的方法进行封装,可以动态获得方法的信息,例如
● getName:获得方法名字
● getParameterTypes:获得方法参数类型
● 除了动态获得方法信息外,Method还能动态调用某一个对象的具体方法
● invoke(Object obj, Object… args) :使用obj调用该方法,参数为args
反射优缺点
● 优点:
● 1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作
● 2.提高代码的复用率,比如动态代理
● 3.可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态 调用
● 缺点:
● 1.反射会涉及到动态类型的解析,导致性能要比非反射调用更低
● 2.使用反射技术通常要在一个没有安全限制的程序运行.
● 3.反射可以绕过一些限制访问的属性或者方法,可能会导致破坏代码本身的抽象 性