spring入门(13)---JDK动态代理
来源:互联网 发布:海岛大亨mac汉化补丁 编辑:程序博客网 时间:2024/06/09 08:11
JDK动态代理
首先我们来了解一下java中的代理模式,代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
1、抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题
2、代理主题(Proxy)角色:
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。
3、真实主题角色
定义了代理角色所代表地真实对象
JDK动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理.下面通过一个(男朋友要和女朋友分手)案例讲解JDK动态代理的实现.
1、创建一个接口
- package www.csdn.spring.jdk.proxy;
- //抽象主题 角色
- public interface SayGoodBye {
- /**
- * 说的内容
- * @param content
- */
- public void say(String content);
- }
package www.csdn.spring.jdk.proxy;//抽象主题 角色public interface SayGoodBye {/** * 说的内容 * @param content */public void say(String content);}
2、创建接口的实现类。
- package www.csdn.spring.jdk.proxy;
- //这是主题角色
- public class SayGoodByeImplimplements SayGoodBye {
- @Override
- public void say(String content) {
- System.out.println("say:" + content);
- }
- }
package www.csdn.spring.jdk.proxy;//这是主题角色public class SayGoodByeImpl implements SayGoodBye {@Overridepublic void say(String content) {System.out.println("say:" + content);}}
3、测试说明
- package www.csdn.spring.jdk.proxy;
- import org.junit.Test;
- public class TestSay {
- @Test
- public void say(){
- //创建对象
- SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
- //调用say方法
- sayGoodByeImpl.say("咱们分手吧!");
- }
- }
package www.csdn.spring.jdk.proxy;import org.junit.Test;public class TestSay {@Testpublic void say(){//创建对象SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();//调用say方法sayGoodByeImpl.say("咱们分手吧!");}}
分析说明:上面创建SayGoodByeImpl的实例,调用了say方法,相当于男朋友自己给女朋友说咱们分手吧.但是男朋友不想和自己的女朋友直接说,想找一个中间人来说。那么就要使用到了代理。下面创建这样的代理类:
4、代理类
- package www.csdn.spring.jdk.proxy;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- /**
- * JDK动态代理
- * @author redarmy
- */
- public class JDKProxyimplements InvocationHandler {
- // 代理目标对象
- private Object target;
- // 创建目标对象的的代理对象
- public Object createProxyInstance(Object target) {
- this.target = target;// 代理的目标对象
- // 创建代理对象
- // 1、定义代理类的类加载器
- // 2、代理类要实现的接口列表
- // 3、 指派方法调用的调用处理程序
- return Proxy.newProxyInstance(target.getClass().getClassLoader(),
- target.getClass().getInterfaces(), this);
- }
- /**
- * proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数
- */
- @Override
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- // 声明返回值
- Object returnValue = null;
- beforeMethod();
- // 执行目标方法
- returnValue = method.invoke(target, args);
- afterMethod();
- // 修改返回值
- return returnValue;
- }
- public void beforeMethod(){
- System.out.println("---------------------目标方法之前执行");
- }
- public void afterMethod(){
- System.out.println("---------------------目标方法之后执行");
- }
- }
package www.csdn.spring.jdk.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * JDK动态代理 * @author redarmy */public class JDKProxy implements InvocationHandler {// 代理目标对象private Object target;// 创建目标对象的的代理对象public Object createProxyInstance(Object target) {this.target = target;// 代理的目标对象// 创建代理对象// 1、定义代理类的类加载器// 2、代理类要实现的接口列表// 3、 指派方法调用的调用处理程序return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);}/*** proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// 声明返回值Object returnValue = null;beforeMethod();// 执行目标方法returnValue = method.invoke(target, args);afterMethod();// 修改返回值return returnValue;}public void beforeMethod(){System.out.println("---------------------目标方法之前执行");}public void afterMethod(){System.out.println("---------------------目标方法之后执行");}}5、测试说明
- <PRE class=java name="code">package www.csdn.spring.jdk.proxy;
- import org.junit.Test;
- public class TestSay {
- @Test
- public void say(){
- //真实主题角色
- SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
- //代理角色
- JDKProxy jdkProxy = new JDKProxy();
- SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);
- //代理说:
- sayProxy.say("你和他分手吧!!!");
- }
- }</PRE>
- <PRE></PRE>
- <P></P>
- <PRE></PRE>
- <P></P>
- package www.csdn.spring.jdk.proxy;
- import org.junit.Test;
- public class TestSay {
- @Test
- public void say(){
- //真实主题角色
- SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();
- //代理角色
- JDKProxy jdkProxy = new JDKProxy();
- SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);
- //代理说:
- sayProxy.say("你和他分手吧!!!");
- }
- }
package www.csdn.spring.jdk.proxy;import org.junit.Test;public class TestSay {@Testpublic void say(){//真实主题角色SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();//代理角色JDKProxy jdkProxy = new JDKProxy();SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);//代理说:sayProxy.say("你和他分手吧!!!");}}
- spring入门(13)---JDK动态代理
- Spring学习心得(13)-- jdk动态代理
- jdk动态代理,spring核心动态代理
- JDK动态代理快速入门
- Spring AOP JDK动态代理
- spring中JDK动态代理
- 【Spring】jdk动态代理例子
- jdk动态代理&spring aop
- spring中的jdk动态代理
- 动态代理(jdk)
- JDK动态代理(Spring AOP理解的基础)
- Spring学习(1)AOP初步—JDK动态代理
- Spring(八)jdk动态代理(AOP简单实现)
- spring的AOP(二)----JDK动态代理
- 动态代理(一)---JDK动态代理
- Spring之AOP的实现(JDK动态代理:只能代理接口,不能代理类)
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- jdk 动态代理与spring 动态代理区别
- Linux-0.00运行环境搭建
- 串口驱动卸载/加载与 GSM 模块电源控制
- 解析 H.264 NAL Unit 帧类型
- Python import细节探索
- asp内置对象
- spring入门(13)---JDK动态代理
- 深入浅出进程与线程的基本概念
- 重构——代码的坏味道
- Java进阶---对象与内存控制(二)(磨灭你的自信)
- 浅谈jQuery的autocomplete()方法
- linux的proc
- iOS 5与iOS 6的 low-memory 处理
- H.264 数据示例
- HTTP请求响应机制