Java反射、Java代理模式

简单来说,JAVA反射是利用类名称来获得这个类的所有信息;代理,是有个传递过程,将自己的类对象传给其他类,让其他类来代理自己的类对象然后做事;

比喻:订外卖,送餐小哥手里的外卖就是我的对象,是我让他送的。静态代理就是我告诉送餐小哥外卖是我的(假设外卖小哥认识我),然后他直接就奔着我来了;动态代理就是我不告诉送餐小哥我是谁,他也不认识我,我只告诉他我的电话或者地址,他自己想办法找到我;注意,他有什么办法找到我呢?就是反射,他利用我的电话和地址,就知道我的一切了(夸张的说)就可以找到我了。

下面通过实例来讲解这两个息息相关的知识点:

1.反射

以servlet为例,在我们的WEB项目,在web.xml文件中通常有这样的配置信息,

<web-app>
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>moreservlets.TestServlet</servlet-class>
</servlet>
</web-app> 

然后,我们部署项目在服务器(tomcat/WebSphere)中,注意,这个时候在服务器上并没有源代码,只有class文件,那么服务器是怎么找到这个servlet类,并生成对象执行方法呢?就是通过反射,在服务器就会通过反射机制利用提供的类名(moreservlets.TestServlet)生成这个类在new对象然后使用对象的一切内容。

补充:我们知道JAVAEE规范中有两个重要的规范:JSP/SERVLET和EJB;而tomcat仅仅支持前者,也就是说,我们如果编写一个遵循EJB的规范的类,部署在tomcat上,尽管大家都是JAVA语言,但是tomcat服务器也是不认识的,因为tomcat服务器只能解析符合JSP/SERVLET规范的类,更进一步的说,即使tomcat服务器通过反射机制还原了一个遵循EJB的规范的类,依然不能使用这类的对象,因为规范不一致。参见:servlet规范EJB规范试想没有这种技术,xml用处也不大了,起码上述代码中,服务器解析完之后,得到的仅仅是一个类名,有嘛意思……

2、代理

其实明白反射机制,动态代理就显得很简单,静态代理不涉及反射。动态代理的用处是需要在原来的方法的功能基础上再添加一些功能,而不用改变这个方法的签名,原来调用这个方法的类依然能正常工作。典型案例就是AOP,还有HADOOP中RCP下图:。

静态代理:被代理的类可以直接并且很明确地将告诉(传递)代理类自己的具体对象。

动态代理:被代理类不能直接告诉代理类有关自己对象的信息,智能提供部分信息,剩余的部分需要代理类根据已有信息动态生成被代理类。

代理模式的话就要和回调函数的原理拿来一起说明会更明白:

回调函数:A调用B,同时传A给B。B执行完会调用A的方法(回调)
   目的就是:A发起调用B,B处理完一些事情,再回调执行A的一些操作。
   两者关系:A和B是关联关系。

代理与回调的区别:

代理,代理类能够代表被代理的前提下(代理类要实现被代理的接口,作为我的代理人,起码得跟我某些重要方面是一个立场吧!)。最终执行我固有方法的类,外貌跟我相似。我是主角。

回调,最终执行我固有方法的类,外貌不强调(你可以不实现我实现的接口)。强调的是,你执行的时候一定要叫上我(一般的回调函数,就做callback,意思就是,喂!该你了!),而作为我也是要传递自己的对象给人家。人家是主角。

代理与回调的相似:都通过别人来执行自己固有的方法代理与回调主要关注的别人怎么来调你。代理调用自己的方法,方法名跟自己一样;回调调用自己的方法,方法名没要求。

   如果想要了解JAVA的反射和动态代理实现原理参照: 反射机制与动态代理,写的很好理解很到位,给个赞!

   

时间: 2024-10-05 05:05:49

Java反射、Java代理模式的相关文章

java反射与代理模式

流程age: 饭前洗手----> 吃饭 --->饭后洗碗 //吃饭 public interface Dinner { //吃饭方法 public void haveDinner(); } //委托类 public class MyDinner implements Dinner { @Override public void haveDinner() { System.out.println("吃饭"); } } 代理类实现InvocationHandler 接口 imp

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

java设计模式6——代理模式

java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代理 动态代理 1.3.代理模式关系图(以租房子为例) 2.静态代理 2.1.角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理客户:代理真实角色.代理真实角色后,我们一般会做一些附属的操作 客户:访问代理对象的人 2.2.例1(租房子演示) 2.2.1.抽象角色实现(

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

java反射+java泛型,封装BaseDaoUtil类。供应多个不同Dao使用

当项目是ssh框架时,每一个Action会对应一个Service和一个Dao.但是所有的Ation对应的Dao中的方法是相同的,只是要查的表不一样.由于封装的思想,为了提高代码的重用性.可以使用java中的泛型+反射去实现最终的封装,将所有的Dao层的共同部分写一个BaseDaoUtil.而所有的Dao都继承这个类. 思路: ----->(1)反射+泛型 ----->(2)当生成子类对象(UserDao),调用空构造时(new UserDao()),子类的空构造会默认调用父类的空构造器(new

Java反射与代理

Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1       Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod()

Java与设计模式-代理模式

代理模式也称为委托模式,属于结构型设计模式,为其他对象提供一种代理,以控制对这个对象的访问.这么听起来很难理解,生活中代理的例子也是很多的,毕业了要找房子,怎样又快又好的找到自己心仪的房子,必须通过租房代理:想要买火车票,火车站太远,我们可以选择代理点进行购票.代码模式的UML类图如下: 应用场景:当无法或不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口.下面我们以"秋菊打官司"为例,讲解一下代

java设计优化--代理模式

代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为了提升系统,对真是对象进行封装,从而达到延迟加载的目的. 在系统启动时,将消耗资源最多的方法使用代理模式分离,就可以加快系统的启动速度,减少用户的等待时间.在用户真正在做查询是,再由代理类加载真实的类,完成用户请求.这就是使用代理模式达到延迟加载的目的. 1.静态代理实现: 主题接口: 1 publ

Java中的代理模式

1.什么是代理模式 代理模式:就是为其他对象提供一种代理以控制对这个对象的访问. 代理可以在不改动目标对象的基础上,增加其他额外的功能(扩展功能). 举个例子来说明代理的作用: 一般我们想邀请明星来当我们的代言人,我们并不能直接联系到明星,而是通过其经纪人,来告诉经纪人我们需要和明星进行合作,然后通过经纪人来转达给明星.,明星只需要做好代言工作就好,其他繁琐的事情就交于经纪人就可以.这里的经经纪人就是一个代理对象,明星就是一个目标对象. 用图表示如下: 2.三种代理模式  2.1 静态代理 静态

java 反射 动态代理

在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大的功能,可以原生实现AOP中 的方法拦截功能.正如英文单词reflection的含义一样,使用反射API的时候就好像在看一个Java类在水中的倒影一样.知道了Java类的内部 结构之后,就可以与它进行交互,包括创建新的对象和调用对象中的方法等.这种交互方式与直接在源代码中使用的效果是相同的,但是又额