发表于: 2018-03-26 23:17:20

1 448


今天完成的事情:
准备讲关于反射机制的小课堂。
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.参考文献
作者:Eason-S
作者:luoxn28
8.更多讨论
1.什么是反射?
一句话总结就是,反射就是把java类中的各种成分通过Class类映射成一个个的Java对象。
2.Java 中 Reflection 和 Introspection 区别?
说起反射,还有一个相似的概念 ‘Introspection’,字面意思是“自省、内省”,它们之间的区别如下:
内省
在运行时检查一个对象的类型或者属性
最常见的例子就是运行时通过 a instanceof A 来判断 a 对象的类型
反射
用来在运行时检查或者修改一个对象信息
可以用来实现看似不可能的操作,比如访问私有方法,动态创建对象
可以看到,反射是在内省的基础上,增加了修改的能力。
3.动态代理与反射的关系。
动态代理的代理类是实现了一个InvocationHandler的接口,我们通过reflect.Proxy的类的newProxyInstance方法就可以得到这个接口的实例,然后再来作为参数传递进去,每一个在代理类上处理的东西也会被重定向到调用处理器上。
至于动态代理和静态代理的区别,即动态代理是动态的创建代理和动态的处理方法的,这也是反射的一个重要体现之处。
明天计划的事情:
遇到的问题:
1.@RequestMapping中method的默认值是什么? 一开始师弟问RequestMapping如果不加方法,那它应该是什么方法?
我记得以前看的一篇说的是get方法,但是怀着仔细看看的意思,就让师弟跑了一跑,以为会出现不支持。结果是,在表单是POST的前提下,程序没有报错,然后仔细查了一下,得到以下结果。
没有默认值,如果不配置method,
则以任何请求形式
RequestMethod.GET,
RequestMethod.POST,
RequestMethod.PUT,
RequestMethod.DELETE都可以访问得到。
然后修改了一下表单的方法,然后表单默认为get方法,在地址栏以参数的形式提交了数据。
也就是RequestMapping在不设置的前提下,默认为支持所有方法。
而表单在不设置的前提下,默认以get的形式提交,且数据会显示在地址栏。
表单在设置的前提下,以设置的方法,当做表单正文的形式提交。
收获:
1.@RequestMapping因为对restful风格有了一个更深的理解。
进度:
任务开始时间:2018年03月18日
预计demo时间:2018年03月30日
禅道地址:http://task.ptteng.com/zentao/project-task-490.html



返回列表 返回列表
评论

    分享到