作者:Seven_Nee来源:https://segmentfault.com/a/11...最近在维护一个公司项目的时候遇到了一个问题,因为实体类中的set方法涉及到业务逻辑,所以在给对象赋值过程中不能使用set方法。为了实现功能,使用反射机制给对象属性赋值。借此机会,我也了解了反射的一些具体用法和使用场景,并从以下两点来分析反射:如果说方法调用是Java的正确打开方式,那么反射机制就是上帝偷偷打开的后门,只要有对应的类,什么都可以调用。那神为什么要开这个后门呢?这里涉及到静态和动态的概念:静态编译:编译时确定类型,绑定对象动态编译:运行时确定类型,绑定对象两者的区别在于动态编译可以最大程度的支持多态,而multistate最大的意义就是降低类之间的耦合,所以反射的优势很明显:解耦,提高代码灵活性。因此,反射的优缺点是:优点是运行时类型的判断,动态类加载:提高代码的灵活性缺点性能瓶颈:反射相当于一系列的解释操作,通知JVM该做什么,它的性能比起直接java代码反射的应用场景要慢很多在我们平时的项目开发过程中,我们很少直接使用反射机制,但这并不代表反射机制没有用。其实很多设计开发都和反射机制有关,比如模块化开发,通过反射调用对应的字节码。动态代理设计模式也采用了反射机制,我们日常使用的Spring/Hibernate等框架也是利用CGLIB反射机制实现的。下面举两个最常见的例子来说明反射机制的强大:.)通过DriverManager类连接数据库。连接时需要输入数据库的连接地址、用户名和密码,通过Connection接口接收连接。publicclassConnectionJDBC{/***@paramargs*///驱动在classpath之前配置的JDBC驱动的JAR包中,publicstaticfinalStringDBDRIVER="com.mysql.jdbc.Driver";//连接地址是各个数据库厂商单独提供的,所以需要分别记住publicstaticfinalStringDBURL="jdbc:mysql://localhost:3306/test";//连接数据库的用户名publicstaticfinalStringDBUSER="root";//连接数据库的密码publicstaticfinalStringDBPASS="";publicstaticvoidmain(String[]args)throwsException{Connectioncon=null;//表示数据库的连接对象Class.forName(DBDRIVER);//1。使用CLASS类加载驱动,反射机制的体现con=DriverManager.getConnection(DBURL,DBUSER,DBPASS);//2、连接数据库System.out.println(con);con.close();//3.关闭数据库}Spring框架的使用在Java反射机制作为基础框架时非常有用。业界有句老话:反射机制是Java框架的基石一般应用层面很少用到,但是这种东西基本很多开源框架都封装好了,基本没必要写你自己。通常,除了hibernate,spring还使用了很多反射机制。最经典的就是xml配置方式。Spring通过XML配置方式加载bean的过程:将程序中所有的XML或Properties配置文件加载到内存中的Java类中,解析XML或properties中的内容,获取类的字节码字符串和相关属性信息对应的实体类。反射机制,根据这个字符串,获取某个类的Class实例,动态配置该实例的属性。Spring这样做的好处是:你不必每次都在代码中去new或做其他事情。如果以后要改,直接改配置文件就可以了。维护代码非常方便。有时为了满足某些需要,Java类可能不会直接调用其他方法。可以使用反射机制模拟Spring加载XML配置文件:publicclassBeanFactory{privateMap
