JAVA 反射技术

 

什么是反射?

JAVA动态语言的关键,反射机制,允许程序在执行时借助于Reflection API取得任何类的内部信息,并能直接操作任何内部类的属性和方法。

 

反射的作用?

在运行时判断任意一个对象所属的类。
在运行时构造任意一个对象。
在运行是判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的成员和方法。
生产动态代理...

 

主要API?

java.lang.Class;

java.lang.reflect.Method;

java.lang.reflect.Feild;

java lang.reflect.ConStructor;

 

Object是一个超类?

定义了public final Class getClass();

此类将被所有子类继承,此类是JAVA反射的源头。

Class对象只能由系统建立一个类在JVM中只有一个Class实例。

最后,object是一个超类。

 

实例Class类对象

  1.已知具体类,通过类的class属性获取,效率最高;如Class clazz = Person.class ;

  2.已知某个类的实例;Class clazz = "person".getClass();

  3.全类名;可能会抛出ClassNotFoundException,Class clazz = Class.forName("java.lang.String");
 

创建类的对象,并获取完整的结构。

   获取Class对象后,创建类对象。

   可以和class.Instance()方法生对象。

   要求:类有一个无参数的构造器,类的构造函数的访问权限足够。

   有的类不具有无参构造器,在操作时明确调用类中的构造方法,并将参数传递进去后,也可实例化操作

   具体代码可以自行百度,我们不可能一一记住代码,思想才是最重要的。

反射技术应用的场景?

从业这么多年,实在没在实际开发中使用过反射,只懂个皮毛?只知道常用的框架就大量用了反射技术。

现在网上摘下反射使用的实际场景;

1). 场景I

(1).有应用程序,但没有源码

一个做好的应用程序,没有源代码。但是现在客户端想为这个应用程序添加自己的新功能,怎么办?存在以下两个需要解决的问题:

问题[1].也就是已经独立运行的App怎么识别客户端自定义的类?(因为App在开发的时候,并不知道客户端的自定义类是什么样子)

问题[2].如果App有办法识别这个了客户端自定义的类,如何使用这个类的对象呢?(因为App的源码不能改变)

(2).问题I的解决办法

[1]. 通常一个应用程序为了扩展性,都会对外暴露一个接口。

[2]. 这个接口由想扩展软件功能的客户端进行实现,之后,该应用软件可以使用符合自己条件的接口的子类对象。

[3]. 以一个图的形式表现出来:

03.反射--01【反射机制】【反射的应用场景】【Tomcat服务器】

[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类文件。

如图:

03.反射--01【反射机制】【反射的应用场景】【Tomcat服务器】

[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). 学习框架技术的要领:学习框架的用途和配置文

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值