1、反射:动态获取信息或动态调用对象的方法的机制。对于任意一个类,都能知道他的所有属性与方法,对于任意对象,都可以获取对象的方法。
应用场景:在第三方应用开发过程中,如果某一个类的方法属性是私有的,或者只对应用系统开放,可以通过反射机制获得自己所需要的信息。
实现方式:1)调用运行时类本身的.class属性
2)利用运行时类的对象获取(getclass())
3)通过类的静态方法获取
4)通过类的加载器
2、在项目中的反射机制的使用(反射的目的扩展未知领域的使用)
一般情况:
1)当软件中要实现安装插件功能时,由于我们并不知道插件类型,也就无法new一个对象,因此使用反射机制获取插件 类,然后再实例化。
2)在编写一个程序时,如果程序中有很多接口,只要实现了这些接口的DLL(动态链接库:包含多个程序,同时使用代码和数据的库)就可以作为插件插入程序中。可以通过反射机制实现,只要加载了DLL,就可以通过反射机制使用DLL中的方法。(工厂模式)
项目中:
1)导出文件,从数据库中获取实体类数据,并将数据以map的形式下载输出到Excel。
2)实现搜索功能时,在页面上显示数据。
以前在使用MVC框架实现搜索功能时,程序按照要求“教师编号”进行搜索,只是遍历存放数据的list<T>,然后过滤出来符合条件的数据,放入新的list<T>中,再显示出来结果。但是(1)list<T>中存放的数据类型多样,泛型不同,且泛型之间没有关联;(按不同的搜索要求搜索)(2)每一个泛型就是一个Bean,而我们要过滤Bean中的属性。项目中多次用到本地过滤,因此需要将功能封装,提高项目复用性,通过反射机制实现解决这两个问题。
现在Spring中对反射机制进行了封装,例如通过XML配置文件实现一个Bean的加载过程就是实现了反射
1)加载配置文件
2)解析配置文件,得到对应的信息(属性、方法),将其放入Bean注册文件中
3)通过反射机制,获取某个类的实例(*实例化Bean的方法),将其放入Spring容器(*Spring容器的启动)中的Bean缓存区(缓存区使用*HashMap存储方式)
4)应用程序可以从Bean缓存区中获取并使用Bean
3、反射的优缺点
优点:动态获取信息,动态代理(AOP中的动态代理:实现了接口的使用JDK的动态代理,没有实现接口的使用CGlib动态代理)使用反射
缺点:性能差,相当于一系列解释语句,告诉jvm应该做什么,比直接的java语句慢。