黑马程序员技术交流社区
标题:
新手做的反射的皮毛,大神指点忽喷!
[打印本页]
作者:
happyli52
时间:
2016-1-9 12:36
标题:
新手做的反射的皮毛,大神指点忽喷!
反射----1
反射机制 反射的应用场景 Tomcat服务器1. Java的反射机制
(1). 反射和类的关系
在程序运行状态中,对任意一个类 (指的是.class文件),都能够知道这个类的所有的属性和方法。
(2). 反射和类对象的关系
反射对于某个类的一个对象,都能够调用它的任意一个方法和属性。
(3). Java反射机制 (基于 (1) 和 (2))
[1]. 这种动态获取类的信息以及动态地调用类对象的方法或者属性的功能称为Java语言的反射机制。
[2]. 通俗的描述反射机制:能动态获取对象的信息就称为反射
(4). Java反射机制的好处
极大地提高了应用程序的扩展性
[1]. 通过多态提高程序的扩展性的弊端
反射以前提高程序的扩展性是通过多态:将子类对象传递给父类引用来实现的
e.g. Animal ani =new Cat();
【缺点】必须要通过new来建立子类对象。子类对象必须写死在代码中。
[2]. 有了反射之后,可以通过反射技术省略掉new对象的一步。
直接将子类对象的类名以字符串的形式传递给反射技术框架并由反射技术框架来创建这个字符串代表的类的实例。
(5). 反射的另类理解
[1]. 反射就是把Java中的类中的各个成分映射成相应的类。
[2]. 一个Java类的组成:
成员变量、成员方法、构造方法、修饰符、包等。
[3]. Java中的一个指定的类中的每一个成员都可以用相应的Java反射类API的一个实例来表示
2. Java反射的应用场景
1). 场景I
(1). 有应用程序,但没有源码
一个做好的应用程序,没有源代码。但是现在客户端想为这个应用程序添加自己的新功能,怎么办?存在以下两个需要解决的问题:
问题[1]. 也就是已经独立运行的App怎么识别客户端自定义的类?(因为App在开发的时候,并不知道客户端的自定义类是什么样子)
问题[2]. 如果App有办法识别这个了客户端自定义的类,如何使用这个类的对象呢?(因为App的源码不能改变)
(2). 问题I的解决办法
[1]. 通常一个应用程序为了扩展性,都会对外暴露一个接口。
[2]. 这个接口由想扩展软件功能的客户端进行实现,之后,该应用软件可以使用符合自己条件的接口的子类对象。
[4]. 解决完问题I,问题II产生了
{1}. 客户端创建了实现了App提供的对外接口Inter的实现子类DemoImpl
{2}. 出现的问题
此时:客户端想把Inter in =new DemoImpl();加入到App中去。但是不能修改源码,那怎么能让App使用客户端建立的子对象呢?
(3). 问题II的解决办法
[1]. 通常应用程序在对外暴露接口之外,还对外提供配置文件。提供了配置文件之后,便可以把客户端自己建立的并且符合标准的类告知应用程序的App,而不用了解应用程序App里面是如何建立这个类的对象的。(从客户端的角度)
[2]{1}. 应用程序App应该做的就是采用IO流技术来读取配置文件。这样,应用程序App便了解到了客户端自定义的类是什么。
[2]{2}. 然后应用程序App根据从IO流中获取到的客户端自定义的类名字符串去寻找相应的.class类文件。
[2]{3}一旦App找到客户端自定义的类文件DemoImpl.class,App可以将其加载到内存中,并通过字节码文件建立对象【这一步使用到了Java的反射技术!!!】。
【分析为什么是反射机制】由于App一定是在客户端使用它之前编写成功,所以,App本身并不能知道未来客户端定义的类的名字,所以,一定是在运行时获取一个类的信息、获取这个类的对象并调用这个对象的有关方法,这便是Java的反射机制的定义
(4). 如何为自行开发的软件提高可扩展性
[1]. 编写软件的时候,要先通过反射技术去实现如何通过类名字符串获取该对象的实例,并且能进行方法调用。
[2]. 然后对外暴露符合自身软件规范的接口
[3]. 提供符合读写规则的配置文件
【知识点回顾】
Hibernate如何识别用户自定义的实体文件?Struts2如何识别用户自定义的Action的子类文件?【都是通过反射技术来实现的】
3. 反射机制的典型应用---Tomcat服务器
1). Tomcat服务器应用到的Java的三大技术
IO技术、ServerSocket技术和反射技术。
2). Tomcat服务器大致处理用户应答的思路
(1). 对外暴露接口---->著名的Servlet (服务器脚本片段)
[1]. 对外提供接口的原因:具体处理客户端应答请求的方式是不一样的。应该根据具体的请求来进行具体的处理。向上抽取形成Servlet接口并提供给客户端使用。
[2]. 由开发者来实现Servlet接口中定义的具体应答请求的处理方式。
(2). 提供配置文件---->web.xml (WEB宏观部署描述文件)
每个Web应用程序都有自己的配置文件web.xml来告知Tomcat服务器(App)有哪些用户自定义的Servlet实现类。
3). Tomcat具体加载处理细节
(1). Tomcat (App)首先读取配置文件web.xml中配置好的Servlet的子类名称
(2). Tomcat根据读取到的客户端实现的Servlet子类的类名字符串去寻找对应的字节码文件。如果找到就将其加载到内存。
(3). Tomcat通过预先设置好的Java反射处理机制解析字节码文件并创建相应的实例对象。之后调用所需要的方法。
【最后】Tomcat一启动,用户自定义的Servlet的子类通过Tomcat内部的反射框架也随之运行。
4. 总结
(1). 反射技术提高了应用程序的可扩展性。
(2). 反射技术应用起来非常简单。为用户和App之间提供了可以交互的配置文件和接口
【用户面对配置文件的难度<<面对源代码的难度】
(3). 反射一般是“接口+配置文件”这种开发形式十分常见
(4). 学习框架技术的要领:学习框架的用途和配置文件
作者:
一大把手
时间:
2016-1-9 15:47
好强大,反射我觉得有点难
作者:
15000183754
时间:
2016-1-16 20:17
加油 加油!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2