java静态代理及动态代理(学习示例)
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静态代理及动态代理(学习示例)的更多相关文章
- JAVA学习篇--静态代理VS动态代理
		
本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者 ...
 - Java设计模式学习06——静态代理与动态代理(转)
		
原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...
 - java之静态代理和动态代理
		
我们以几个问题,来开始我们今天的学习,如果下面几个问题,你都能说出个一二,那么恭喜你,你已经掌握了这方面的知识.1,什么是代理模式?2,Java中,静态代理与动态代理的区别?3,Spring使用的是J ...
 - java中静态代理,动态代理知识的补充
		
文章转载自:http://blog.csdn.net/jialinqiang/article/details/8950989 一.Java动态代理 相对于静态代理的代理类在编译时生成(.class文件 ...
 - 黑马程序员:Java基础总结----静态代理模式&动态代理
		
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
 - Java中的代理模式--静态代理和动态代理本质理解
		
代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...
 - java 代理模式(静态代理、动态代理、Cglib代理) 转载
		
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
 - Java 静态代理和动态代理例子
		
代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委 ...
 - java静态代理和动态代理(一)
		
代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题. 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为 ...
 
随机推荐
- Java集合类里面最基本的接口
			
Collection:代表一组对象,每一个对象都是它的子元素. Set:不包含重复元素的Collection. List:有顺序的Collection,并且可以包含重复元素. Map:可以把键(key ...
 - java命令-jstack
			
jstack用于生产java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法 堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,比如线程间死锁.死循环. ...
 - jQuery取值/赋值常见方法收集
			
1.文本取值.赋值 $("#id").attr("value"); $("#id").val(); $("#id).attr(&q ...
 - @InitBinder 前端传递date时间类型属性时,转换错误问题
			
在Controller里加上这段代码 @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomE ...
 - ORA-20782: Creating GGS_DDL_RULES
			
在11g数据库上安装goldengate,运行@ddl_setup.sql时有如下错误 ERROR at line 1: ORA-20782: Creating GGS_DDL_RULES table ...
 - 转载  Struts2之------Action类中的get,set方法和execute方法的使用规范和使用流程(规范是没有理由的,必须遵守!!!)
			
1,Action中get,set方法的使用流程? 前台form中有一个<input type="text" name="username"/> 如果 ...
 - 备份Oracle 数据库。
			
#!/bin/bash# 2018-07-07 oracle database back#filename=`date +%Y%m%d`filename=`date +%Y_%m_%d_%H%M`di ...
 - 洛谷P1122 最大子树和 (树状dp)
			
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
 - Python每日一题 005
			
任一个英文的纯文本文件,统计其中的单词出现的个数. 代码 # coding:utf-8 import re def get_word(filename): fp=open(filename," ...
 - LOJ 2720 「NOI2018」你的名字——后缀自动机
			
题目:https://loj.ac/problem/2720 自己总是分不清 “SAM上一个点的 len[ ] ” 和 “一个串的前缀在 SAM 上匹配的 len ”. 于是原本想的 68 分做法是, ...