- 浏览: 415295 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
liyuanhoa_:
...
struts2.0中struts.xml配置文件详解 -
chenmingde:
...
Velocity应用(一) -
weizhikai_ai:
第二十六,当一个线程进入一个对象的一个synchronized ...
Java常见面试题(含答案) -
Aurora_lr:
...
Spring宠物商店学习笔记(一) - -
zs911zs:
all copy from http://www.iteye ...
Mule入门文档
代理模式:为其他对象提供一种代理以控制对这个对象的访问.说白了就是,在一些情况下客户不想或不能直接引一个对象,而代理对象可以在客户和目标对象之间起到中介作用.去掉客户不能看到的内容和服务或都增添客户需要的额外服务.
给大家举个比较简单的例子:
假如你买台IBM的笔记本,IBM产家是不提供鼠标的.但是我们如果从代理商的手里买就有鼠标和送.
很简单的例子,写几个类来实现一下吧.
首先设计一个购买的接口代码如下:(ComputerInterface.java)
package test.lyx;
publicinterface ComputerInterface {
publicvoid buy();
}
建一个电脑类实现购买的接口代码如下:(Computer.java)
package test.lyx;
publicclass Computer implements ComputerInterface{
private String pcName="IBMT60";
privateintpcPrice=17800;
public String getPcName() {
returnpcName;
}
publicvoid setPcName(String pcName) {
this.pcName = pcName;
}
publicint getPcPrice() {
returnpcPrice;
}
publicvoid setPcPrice(int pcPrice) {
this.pcPrice = pcPrice;
}
publicvoid buy() {
System.out.print("获得笔记本电脑:"+pcName+"一台");
}
}
再建设一个代理商的类:用来完成买电脑和赠送鼠标:(ComputerProxy.java)
package test.lyx;
publicclass ComputerProxy {
private ComputerInterface pci;
public ComputerInterface getPci() {
returnpci;
}
publicvoid setPci(ComputerInterface pci) {
this.pci = pci;
}
publicvoid buy(){
pci.buy();
System.out.println("赠送鼠标一个");
}
}
建一个主函数测试一下吧:(TestDemo.java)
package test.lyx;
publicclass TestDemo {
publicstaticvoid main(String[] args) {
ComputerProxy c1=new ComputerProxy();
c1.setPci(new Computer());
c1.buy();
}
}
运行结果如下:
获得笔记本电脑:IBMT60一台获得鼠标一个
以上就是代理功能的实现,由代理商销售笔记本,并赠送鼠标.但是这样的程序只适合是销售IBM笔记本.那么如果要是其它品牌呢.所以我们来更改一个代理类.来实现动态的代理.
建立一个类代码如下:(ComputerProxy2.java)
package test.lyx;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
publicclass ComputerProxy2 implements InvocationHandler{
private Object delegate;
//描述是谁的代理,也就是与那个类有关系
public Object bind(Object delegate){
this.delegate=delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("赠送鼠标一个!");
Object result=method.invoke(delegate, args);
return result;
}
}
然后在主函数中加上:
ComputerProxy2 c2=new ComputerProxy2();
ComputerInterface ci2=(ComputerInterface)c2.bind(new Computer());
ci2.buy();
就可以实现动态代理了.
动态代理一定要实现这个InvocationHandle接口.接口里面有两个方法.一个bind描述代理那个类,也就是与那个类有关系,主函数里我调用bind方法时给出Computer.也就是代理的Computer类.还有一个方法invoke就是代理与要执行的方法.
对啊,IBM的本只送鼠标.如果现在SONY的本送鼠标和包,静态的代理就实现不了了.只有改程序了.使用动态代理,我们只关注买的是什么品牌的本.送的是什么东西.
好,如果你让你这个动态代理去卖SONY的本子,他怎么送包?你还不是要修改invoke方法么?
动态代理的好处并不是要动态处理不同的任务,而是动态处理不同的类型,我所说的类型,指的是接口类型。
如果说你的IBM本和sony本继承的同样的接口,用动态代理一点儿意义都没有了。因为它和静态代理一样,只能完成一件附加任务。
嗯,也有道理,
为其他对象提供一种代理以控制对这个对象的访问,说白了就是,在一些情况下客户不想或都不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或都增添客户需要的额外服务.
无论是什么代理商本是肯定的卖的,我们就要实现ComputerInterface这个接口,而不同的代理商优惠的条件不同,在这里也就是说赠的东西不同,我们代理的目的,和现时一样,本本卖的基础上,各个代理商送的东西不同.invoke这个方法在这里就描述了我们送的是什么东西.
我是这样认为的.
可能我们想的都一样,只是描述的不是很清楚吧。
动态代理和静态代理的主要区别是,静态代理已经知道自己要代理什么类型的东西了,而动态代理却不知道。
比如说,静态代理已经明确是代理买还是卖,还是修理。
但是动态代理不知道,它可以代理一切,只要是有可代理的东西。
但是在代理商自己的附加动作上,两种代理方式应该都是确定了的。
如果一个代理商要送鼠标,那他只能送鼠标,不管他是卖什么东西。
如果想送鼠标又要送键盘,那就得再找一个代理商,不管是静态的还是动态的。
给大家举个比较简单的例子:
假如你买台IBM的笔记本,IBM产家是不提供鼠标的.但是我们如果从代理商的手里买就有鼠标和送.
很简单的例子,写几个类来实现一下吧.
首先设计一个购买的接口代码如下:(ComputerInterface.java)
package test.lyx;
publicinterface ComputerInterface {
publicvoid buy();
}
建一个电脑类实现购买的接口代码如下:(Computer.java)
package test.lyx;
publicclass Computer implements ComputerInterface{
private String pcName="IBMT60";
privateintpcPrice=17800;
public String getPcName() {
returnpcName;
}
publicvoid setPcName(String pcName) {
this.pcName = pcName;
}
publicint getPcPrice() {
returnpcPrice;
}
publicvoid setPcPrice(int pcPrice) {
this.pcPrice = pcPrice;
}
publicvoid buy() {
System.out.print("获得笔记本电脑:"+pcName+"一台");
}
}
再建设一个代理商的类:用来完成买电脑和赠送鼠标:(ComputerProxy.java)
package test.lyx;
publicclass ComputerProxy {
private ComputerInterface pci;
public ComputerInterface getPci() {
returnpci;
}
publicvoid setPci(ComputerInterface pci) {
this.pci = pci;
}
publicvoid buy(){
pci.buy();
System.out.println("赠送鼠标一个");
}
}
建一个主函数测试一下吧:(TestDemo.java)
package test.lyx;
publicclass TestDemo {
publicstaticvoid main(String[] args) {
ComputerProxy c1=new ComputerProxy();
c1.setPci(new Computer());
c1.buy();
}
}
运行结果如下:
获得笔记本电脑:IBMT60一台获得鼠标一个
以上就是代理功能的实现,由代理商销售笔记本,并赠送鼠标.但是这样的程序只适合是销售IBM笔记本.那么如果要是其它品牌呢.所以我们来更改一个代理类.来实现动态的代理.
建立一个类代码如下:(ComputerProxy2.java)
package test.lyx;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
publicclass ComputerProxy2 implements InvocationHandler{
private Object delegate;
//描述是谁的代理,也就是与那个类有关系
public Object bind(Object delegate){
this.delegate=delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("赠送鼠标一个!");
Object result=method.invoke(delegate, args);
return result;
}
}
然后在主函数中加上:
ComputerProxy2 c2=new ComputerProxy2();
ComputerInterface ci2=(ComputerInterface)c2.bind(new Computer());
ci2.buy();
就可以实现动态代理了.
动态代理一定要实现这个InvocationHandle接口.接口里面有两个方法.一个bind描述代理那个类,也就是与那个类有关系,主函数里我调用bind方法时给出Computer.也就是代理的Computer类.还有一个方法invoke就是代理与要执行的方法.
对啊,IBM的本只送鼠标.如果现在SONY的本送鼠标和包,静态的代理就实现不了了.只有改程序了.使用动态代理,我们只关注买的是什么品牌的本.送的是什么东西.
好,如果你让你这个动态代理去卖SONY的本子,他怎么送包?你还不是要修改invoke方法么?
动态代理的好处并不是要动态处理不同的任务,而是动态处理不同的类型,我所说的类型,指的是接口类型。
如果说你的IBM本和sony本继承的同样的接口,用动态代理一点儿意义都没有了。因为它和静态代理一样,只能完成一件附加任务。
嗯,也有道理,
为其他对象提供一种代理以控制对这个对象的访问,说白了就是,在一些情况下客户不想或都不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或都增添客户需要的额外服务.
无论是什么代理商本是肯定的卖的,我们就要实现ComputerInterface这个接口,而不同的代理商优惠的条件不同,在这里也就是说赠的东西不同,我们代理的目的,和现时一样,本本卖的基础上,各个代理商送的东西不同.invoke这个方法在这里就描述了我们送的是什么东西.
我是这样认为的.
可能我们想的都一样,只是描述的不是很清楚吧。
动态代理和静态代理的主要区别是,静态代理已经知道自己要代理什么类型的东西了,而动态代理却不知道。
比如说,静态代理已经明确是代理买还是卖,还是修理。
但是动态代理不知道,它可以代理一切,只要是有可代理的东西。
但是在代理商自己的附加动作上,两种代理方式应该都是确定了的。
如果一个代理商要送鼠标,那他只能送鼠标,不管他是卖什么东西。
如果想送鼠标又要送键盘,那就得再找一个代理商,不管是静态的还是动态的。
发表评论
-
java关键字native,volatile,transient
2009-02-25 15:12 13681.volatile:为了获得最佳速度,java允许线程保存共 ... -
quartz+spring
2009-02-12 14:48 3364Quartz 是一个强大的企业级 Schedule 工具,也是 ... -
Java虚拟机(JVM)参数配置说明
2009-01-08 16:02 2625在Java、J2EE大型应用中,JVM非标准参数的配置直接关系 ... -
@SuppressWarnings 详解
2009-01-08 15:27 990@SuppressWarnings J2SE 提供的最后一个 ... -
批量反编译java类文件
2009-01-08 10:30 1573所使用的软件是 DJ Java Decompiler 3.7。 ... -
LDAP定义
2008-12-23 10:20 1185LDAP是轻量目录访问协议 ... -
JMS总结和参考资料
2008-12-22 17:33 1820结束语 第 1 页(共3 页) 本教程提供了对 Ja ... -
JMS--Pub/Sub编程
2008-12-22 17:27 1109相同又不同 第 1 页(共1 页) 附录中有这两个 ... -
JMS--Pub/Sub接口
2008-12-22 17:24 1903介绍 第 1 页(共7 页) 现在让我们来查看 Pub/s ... -
JMS点对点编程
2008-12-22 17:15 1643介绍 第 1 页(共10 页) ... -
JMS点对点接口
2008-12-22 17:03 1493介绍 第 1 页(共8 页) ... -
JMS用公用接口进行客户机编程
2008-12-22 17:01 975绍 第 1 页(共11 页) 在这一节中,我们将查看 ... -
JMS公用接口
2008-12-19 18:01 1078在这一节中,我们将介绍 JMS 客户机编程的每一个重要 JMS ... -
JMS学习教程概述
2008-12-19 17:55 3129应用程序 第 1 页(共15 页) http://liy ... -
JNDI定义
2008-12-19 09:56 1061Java术语 英文全称是:Java Naming and ... -
Java 编程的动态性,第 8 部分: 用代码生成取代反射
2008-12-18 11:52 1012运行时代码生成为获得 ... -
Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码
2008-12-18 11:51 1261Apache BCEL 让您深入 JVM 汇编语言进行类操作的 ... -
Java 编程的动态性,第 6 部分: 利用 Javassist 进行面向方面的更改
2008-12-18 11:50 1136用 Javassist 进行字节码 ... -
Java 编程的动态性,第 5 部分: 动态转换类
2008-12-18 11:48 1055学习如何在使用 Javassist ... -
Java 编程的动态性, 第四部分: 用 Javassist 进行类转换
2008-12-18 11:47 1057用 Javassist 转换字节码中的方法 文档 ...
相关推荐
Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...
### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...
总的来说,Java动态代理实现数据源连接池的核心思想是利用`InvocationHandler`来拦截对数据库操作的调用,通过代理对象在每次操作前后进行连接的获取和释放,从而实现连接池的逻辑。这种方式虽然相比现成的连接池库...
### Java动态代理实现数据库连接池 #### 背景与挑战 在开发应用程序时,数据库连接池是一个常用且重要的组成部分。频繁地建立和断开数据库连接不仅效率低下,还可能导致性能瓶颈。为了解决这一问题,引入了数据库...
下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本概念。委托模式通常由三部分组成:委托者(Delegate)、被委托者(Subject)和客户端(Client)。委托...
Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...
### 使用Java动态代理实现一个简单的网络请求拦截器 #### 一、引言 在软件开发过程中,为了增强程序的功能或方便进行调试与监控,我们常常需要在不改变原有业务逻辑的基础上,添加一些额外的行为(如日志记录、...
在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....
Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现的。Proxy类用于创建动态代理实例,而InvocationHandler接口则定义了调用处理程序的逻辑,即当代理对象的方法被...
- `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...
在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...
在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类(代理类)可以代理原始类(目标类)...