java的代理模式(静态和动态代理)
2017-06-27 10:48
447 查看
1.静态代理
(1)公共接口
(2)委托类
(3)静态代理类
(代理类持有委托类对象,并实现了相同的接口,从而控制委托类的方法)
(4)执行代码
2.jdk动态代理
(1)生成动态代理的类
(2)执行代码
(1)公共接口
package com.ming.proxy; /* * 公共接口 */ public interface Kill { String kill(); void say(); }
(2)委托类
package com.ming.proxy; /* * 委托类:我想要杀一个人但是不想亲自动手,委托给别人来做,雇佣杀手,Killer类 */ public class Mine implements Kill { @Override public String kill() { System.out.println("我想要杀一个人。。。"); return "mine"; } @Override public void say() { System.out.println("我是mine"); } }
(3)静态代理类
(代理类持有委托类对象,并实现了相同的接口,从而控制委托类的方法)
package com.ming.proxy; /** * * @ClassName: Killer * @Description: TODO(代理类:杀手) * @author chenliming * @date 2017年6月27日 上午10:20:13 * */ public class Killer implements Kill { private Mine mine; public Killer(Mine mine) { super(); this.mine = mine; } @Override //杀手可以决定怎么执行刺杀任务 public String kill() { System.out.println("刺杀前准备"); mine.kill(); System.out.println("刺杀后处理"); return "killer"; } @Override public void say() { System.out.println("我是杀手"); } }
(4)执行代码
package com.ming.proxy; import org.junit.Test; /* * 静态代理: * 1.委托类和代理类实现相同的接口; * 2.代理类持有委托类的对象 */ public class TestProxy { @Test /* * 测试静态代理模式 */ public void testStaticProxy() { //委托类 Mine mine = new Mine(); //代理类 Killer killer = new Killer(mine); killer.kill(); } }
2.jdk动态代理
(1)生成动态代理的类
package com.ming.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyInvocationHandler implements InvocationHandler { private Object obj = null; /* * 生成代理对象 */ public Object bind(Object obj) { this.obj = obj; //生成代理对象参数(类加载器,类的所有接口,InvocationHandler对象) return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } @Override /** * 动态代理对象执行的方法,可以随意增强或者改变方法的执行 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("kill".equals(method.getName())) { System.out.println("=====before====="); Object temp = method.invoke(this.obj, args); System.out.println("=====after======"); return "动态代理的改变返回值";//可以改变返回值 } else { return null; } } }
(2)执行代码
package com.ming.proxy; import org.junit.Test; /* * 静态代理: * 1.委托类和代理类实现相同的接口; * 2.代理类持有委托类的对象 */ public class TestProxy { @Test /* * 测试静态代理模式 */ public void testStaticProxy() { //委托类 Mine mine = new Mine(); //代理类 Killer killer = new Killer(mine); killer.kill(); } @Test /* * 测试java动态代理模式 */ public void testDyProxy() throws Exception { MyInvocationHandler demo = new MyInvocationHandler(); Kill subject = (Kill) demo.bind(new Mine()); String temp = subject.kill(); System.out.println(temp); subject.say(); } }
相关文章推荐
- JAVA 设计模式:静态代理VS动态代理
- java 设计模式 代理 静态和动态
- JAVA的代理模式(静态代理、JDK动态代理、cglib动态代理)
- java设计模式之静态代理与动态代理
- Java模式中的静态代理与动态代理
- 代理模式(静态代理+动态代理)——JAVA
- 【GOF23设计模式】_代理模式_静态代理_动态代理_开发场景JAVA236-237
- Java设计模式之 静态代理和动态代理
- Java设计模式学习06——静态代理与动态代理
- java中的静态和动态代理模式
- java 代理模式(静态代理+动态代理)
- java 设计模式之四-代理模式 java静态代理和动态代理
- JAVA设计模式之代理模式(静态代理和动态代理)
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- 黑马程序员:Java基础总结----静态代理模式&动态代理
- java设计模式之四:代理模式 java静态代理和动态代理
- Java 设计模式——静态代理模式和动态代理模式
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
- java的代理模式(动态代理和静态代理)
- Java设计模式——代理模式(静态代理vs动态代理)