1.接口

        public interface Channel {
void send();
}

2.实现类(可以为各种不同实现)

        public class ChannelImpl implements Channel {
@Override
public void send() {
System.out.println("send Message");
}
}

3.静态代理:代理类

        public class ChannelProxy implements Channel{
//代理对象
Channel channel;
//传入代理对象
public ChannelProxy(Channel channel){
this.channel = channel;
}
@Override
public void send() {
System.out.println("start send message");
channel.send();
System.out.println("end send message");
}
}

3.动态代理:代理类

        /**创建代理实现InvocationHandler*/
public class MyHandler implements InvocationHandler {
/**
* 目标对象
*/
Object target; public MyHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start send message");
System.out.println("调用目标对象:"+target.getClass()+",目标方法:"+method.getName());
Object result = method.invoke(target);
System.out.println("end send message");
return result;
}
}

4.调用

        public class ProxyTest {
public static void main(String [] args){
System.out.println("=================静态代理===================");
Channel channel = new ChannelImpl();
ChannelProxy channelProxy = new ChannelProxy(channel);
channelProxy.send(); System.out.println("=================动态代理===================");
MyHandler myHandler = new MyHandler(channel);
Channel target = (Channel)(Proxy.newProxyInstance(channel.getClass().getClassLoader(),channel.getClass().getInterfaces(), myHandler));
target.send();
}
}

5.结果

        =================静态代理===================
start send message
send Message
end send message
=================动态代理===================
start send message
调用目标对象:class proxy.ChannelImpl,目标方法:send
send Message
end send message

比较:

静态代理:
代理类不用关心具体哪个实现类及如何实现send方法,调用时只需要代理类即可,解耦.但是代理类及实现类需全部实现接口,若添加接口,则代理类与实现类均需添加,代码冗余,且改代理类只能代理该一个接口,若需要代理其他接口,则需要创建新的代理类
动态代理:
在静态代理基础上,去除了静态代理的冗余,无需实现指定的接口,任何接口均可代理,若接口Channel还有其他方法如create()方法,则MyHandler的invoke一样会进行处理,所以当接口中方法比较多时,我们又需要对该接口中的方法进行统一处理,则使用动态处理更为方便,复用性更强

java静态代理及动态代理(学习示例)的更多相关文章

  1. JAVA学习篇--静态代理VS动态代理

    本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者 ...

  2. Java设计模式学习06——静态代理与动态代理(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...

  3. java之静态代理和动态代理

    我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...

  4. java中静态代理,动态代理知识的补充

    文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...

  5. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  6. Java中的代理模式--静态代理和动态代理本质理解

    代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...

  7. java 代理模式(静态代理、动态代理、Cglib代理) 转载

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  8. Java 静态代理和动态代理例子

    代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委 ...

  9. java静态代理和动态代理(一)

    代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题. 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为 ...

随机推荐

  1. jQuery 实现表格变色效果

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  2. Es学习第四课, 倒排索引

    大家知道,ES的发明者初衷是想做一个搜索引擎给自己老婆用来搜菜谱,所以ES的核心工作就是做搜索,下面我们就开始讲关于搜索方面的知识点. DOC的概念我们第一课就讲过,它是ES存储数据的最小单元,我们再 ...

  3. jQuery的ajaxFileUpload上传文件插件刷新一次才能再次调用触发change

    jQuery的ajaxFileUpload插件 关于用ajaxfileupload时,遇到一个要刷新一次页面才能再次上传,用live()方法来绑定 file表单 的change事件就能够解决,直接$( ...

  4. Spring 讲解(五)

    Spring 中使用 xml 配置开发和使用注解开发案例 1.Spring 中使用 xml 配置开发案例 接口 public interface UserDao { void add(User use ...

  5. Delphi 格式化函数 Format函数

    function Format(const Format: string; const Args: array of const): string; function Format(const For ...

  6. Mac系统下安装Homebrew后无法使用brew命令

    打开终端输入 brew提示:command not found 解决方法 输入命令: sudo vim .bash_profile 然后输入以下代码: export PATH=/usr/local/b ...

  7. Temporarily disable Ceph scrubbing to resolve high IO load

    https://blog.dachary.org/2014/08/02/temporarily-disable-ceph-scrubbing-to-resolve-high-io-load/ In a ...

  8. STM32例程之USB HID双向数据传输(源码下载)【转】

    程序功能 将STM32的USB枚举为HID设备. STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收. 端点长度为64,也就是单次最多可以传输64个字节数据. STM32获取上位 ...

  9. 63、saleforce DML

    PRIVELEGE__c privilege = new PRIVELEGE__c(PRIVILAGENAME__c = '权限添加',PRIVILAGEDESCRIBE__c = '权限描述'); ...

  10. java %d %n \n

    Java中,%d和%f分别用来表示输出时,替换整型输出和浮点型输出的占位符. 如: int a=28; float b = 13.0f; System.out.printf("整数是:%d% ...