反射
反射是java的一套API java.lang.reflect包
反射API是java的动态执行机制;
1)可以在运行期间动态加载类;
2)可以在运行期间动态创建对象;
3)可以在运行期间动态访问属性和方法;
常见框架(spring , MyBatis , struts, Hibernate)都采用反射API实现;
静态执行:当代码编译完,就能确定的调用执行关系,运行期间按照编译结果执行的程序,称为静态执行,
简称静态;
动态执行:与静态相反,在运行期间才能确定的调用执行关系称为动态,反射API就是用于动态执行的API;
class
class对象代表的信息,基本类型信息,java中任何类型加载内存中都是Class的对象,提供了动态加载类信息
的方法:class.forName(类名);
利用class对象可以获取类的所有申明信息:
cls.getDeclaredFields():获取全部的属性申明信息;
cls.getDeclaredMethods():获取全部的方法信息;
Class提供了动态创建对象,动态调用无参数构造器创建对象的方法;
cls.newInstance();
功能:运行期间动态创建对象;
前提:这个类必须有无参数构造器(或默认构造器),否则出现异常;
new ArrayList():是静态创建对象,事先知道类名;
cls.newInstace():是动态创建对象,事先不执行类名,类名是运行期间动态输入的,如果在开发中,
遇到了不知道类名的时候创建对象,使用反射动态创建对象;
Class提供了动态查找方法的功能;
cls.getDeclaredMethods():查找全部的方法;
cls.getDeclaredMethod(方法签名):查找一个方法;
Method提供了动态执行方法的功能
Method提供了invoke方法,用于动态执行方法;
m.invoke(对象,参数列表)实际按照对象.m(参数列表)执行方法;
总结反射:
1)何时使用反射:动态加载类,动态创建对象,动态调用方法,动态访问属性;
2)反射的功能:动态执行;
3)反射是java提供的API,拿来使用即可;
4)反射使用技巧:
4.1)class对象作为入口:class.forName:根据类名加载类;
obj.getClass():根据对象找到类;
类名.class 已知类名找到Class对象;
4.2)创建对象,找到相关类信息(属性,方法);
4.3)动态调用属性,方法;
5)必须掌握重点方法:class.forName;class.newInstance;Method.invoke;
面试题
1)框架底层用什么实现 :反射;
2)反射是什么:反射是java动态执行API;
3)反射有哪些功能:动态加载类,动态创建对象,动态执行方法,动态访问属性;
4)如何用反射创建对象:使用newInstance方法;
5)如何反射调用方法:使用invoke方法;