Java的反射特性是一项非常强大和有用的功能,它使得我们可以轻松的在运行时观察到类实例的内部状态,并且可以动态的操作实例,从而为Java语言提供更多更灵活的想象空间。随便举几个例子:使用反射可以动态的映射Java对象属性到Json文件属性的操作,这一点无论在FastJson,还是GSON或者是jackson上都体现的淋漓尽致。此外使用反射可以轻松的用在JDBC中完成Java Bean和数据库表的动态适配组装,如我们熟知的hibnate,jpa,等持久化框架也都是利用了这种特性,最后无论是动态代理的AOP,还是OSGI的动态加载都离不开反射的辅助,由此可见反射的强大之处。
Java反射可以获取很多类的信息,如下:
(1)获取实例本身的信息
(2)获取实例的字段
(3)获取实例的构造函数
(4)获取实例的方法
(5)获取实例的私有的字段和方法
(6)获取实例的注解信息
(7)获取实例里面的数组
(8)获取实例的泛型类型
(9)获取实例的模块类型
(10)配合实现动态代理
(11)配合实现动态类的加载和热加载
下面是一个获取类里面所有方法的简单功能:
输出如下:
注意,从上面的输出中我们能够看到,除了我们自定义的方法外,还有来自继承父类Object的方法也会被打印输出,另外我们注意到wait方法被输出了三次,这一次因为在Objec类里面,这个方法有三个重载,所以被输出了三次,当然通过反射的API,我们也是可以获取到每个重载方法有几个参数,以及参数的类型是什么。
本篇文章主要简单的介绍了Java反射技术基本功能和应用场景,Java反射技术核心都是围绕着Class这个类展开的,所有反射可以获取到的信息都在Class类里面可以找到对应的API和方法,学习和了解反射技术是非常有用的,将有助于看清很多高级功能的底层原理,凡事有利必有弊,反射在带来灵活性的同时,也带来了一定的弊端比如对封装性的破坏以及反射自身调用性能低下等问题,所以在实际应用中应该权衡考虑,因地制宜,后面我们会结合具体的例子和场景来进一步介绍反射相关的内容。