大家好,我是IT修真院深圳分院的学员,一枚正直纯洁善良的JAVA程序员。本次为大家带来关于反射的入门。
1.背景介绍
反射主要是指程序可以访问,检测和修改它本身状态或行为,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义的一种能力。
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。可以说类中有什么信息,就可以利用反射机制获得什么信息。
反射机制,能够使我们很方便的创建灵活的代码,
这些代码可以在运行时装配,而无需在组件之间进行源代码链接。在java中是一种非常强大的功能。
但是反射使用不当会影响到程序的性能。
2.知识剖析
反射是框架设计的灵魂
要正确使用Java反射机制就得使用java.lang.Class类。它是Java反射机制的起源。
Class提供了四个public方法,用于获取类的构造方法。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Constructor getConstructor(Class[] params)
根据构造函数的参数,返回一个具体的具有public属性的构造函数
Constructor getConstructors()
返回所有具有public属性的构造函数数组
Constructor getDeclaredConstructor(Class[] params)
根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
Constructor getDeclaredConstructors()
返回该类中所有的构造函数数组(不分public和非public属性)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
四种获取成员方法的方法
Method getMethod(String name, Class[] params)
根据方法名和参数,返回一个具体的具有public属性的方法
Method[] getMethods()
返回所有具有public属性的方法数组
Method getDeclaredMethod(String name, Class[] params)
根据方法名和参数,返回一个具体的方法(不分public和非public属性)
Method[] getDeclaredMethods()
返回该类中的所有的方法数组(不分public和非public属性)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
四种获取成员属性的方法
Field getField(String name)
根据变量名,返回一个具体的具有public属性的成员变量
Field[] getFields()
返回具有public属性的成员变量的数组
Field getDeclaredField(String name)
根据变量名,返回一个成员变量(不分public和非public属性)
Field[] getDelcaredField()
返回所有成员变量组成的数组(不分public和非public属性)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.常见问题
1.反射的优缺点?
4.解决方案
优点:
1、反射提高了程序的灵活性和扩展性。
2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。
因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
5.编码实战
让我们来看看这个例子的代码。
6.扩展思考
反射创建对象比直接创建对象慢,为什么还要使用反射?
所有基于性能的考虑,都要放到具体的使用量上去考虑,只有将函数放到百万千万级去看,去看看具体的性能差异是多少。而对于普通程序来说,这种程度的使用对性能的影响是微乎其微的。
7.参考文献
链接:https://www.cnblogs.com/Eason-S/p/5851078.html
作者:Eason-S
链接:http://www.cnblogs.com/zhaoyanjun/p/6074887.html
作者:luoxn28
8.更多讨论
1.什么是反射?
一句话总结就是,反射就是把java类中的各种成分通过Class类映射成一个个的Java对象。
2.Java 中 Reflection 和 Introspection 区别?
说起反射,还有一个相似的概念 ‘Introspection’,字面意思是“自省、内省”,它们之间的区别如下:
内省
在运行时检查一个对象的类型或者属性
最常见的例子就是运行时通过 a instanceof A 来判断 a 对象的类型
反射
用来在运行时检查或者修改一个对象信息
可以用来实现看似不可能的操作,比如访问私有方法,动态创建对象
可以看到,反射是在内省的基础上,增加了修改的能力。
3.动态代理与反射的关系。
动态代理的代理类是实现了一个InvocationHandler的接口,我们通过reflect.Proxy的类的newProxyInstance方法就可以得到这个接口的实例,然后再来作为参数传递进去,每一个在代理类上处理的东西也会被重定向到调用处理器上。
至于动态代理和静态代理的区别,即动态代理是动态的创建代理和动态的处理方法的,这也是反射的一个重要体现之处。
PPT链接:戳这里看PPT
腾讯视频:腾讯视频
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧