初识代理——Proxy
Posted xscc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识代理——Proxy相关的知识,希望对你有一定的参考价值。
无处不在的模式——Proxy
最近在看《设计模式之禅》,看到代理模式这一章的时候,发现自己在写spring项目的时候其实很多时候都用到了代理,无论是依赖注入、AOP还是其他,可以说是无处不在。
于是自己便自己摸索写了一些小例子,当然也参考了网上其他博主的博客,毕竟小白一枚hhhhhh
进入正题:
图1-1:代理Proxy
代理模式现在主流的有两大类:1、JDK代理 2、CGLB代理
(JDK静态代理就不说了,网上很多都有,主要我觉得现在面向企业项目,静态代理局限性有点大,对于我而言可能就只是去了解了一下,而并没有说想要去深入这个)
Th1:JDK动态接口代理(需要实现InvocationHandler接口中的invoke(...)方法,必须实现某个接口)
public class MyJdkProxy implements InvocationHandler // 目标对象 public Object target; // 初始化传入代理对象 public MyJdkProxy(Object target) this.target = target; @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable System.out.println("xsc"); return method.invoke(target,args); public Object newProxy() // 获取代理目标对象实例 return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this );
Th2:CGLB动态接口代理(需要实现MethodInterceptor接口中的intercept(...)方法,当然也可无需实现接口,可直接代理类)
public class MyCgljProxy implements MethodInterceptor // 目标对象 public Object target; // 初始化传入代理对象 public MyCgljProxy(Object target) this.target = target; @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable System.out.println("cj"); return methodProxy.invoke(target,objects); public Object newProxy() // 获取代理目标对象实例 return Enhancer.create(target.getClass(),this);
Th3:测试类Test.java
public class Test // 需要代理的接口 interface Subject void sayHi(); void sayHallo(); // 代理接口实现类 static class SubjectImpl implements Subject @Override public void sayHi() System.out.println("Hi"); @Override public void sayHallo() System.out.println("Hello"); public static void main(String[] args) // JDK动态接口代理方式 Subject target1 = new SubjectImpl(); MyJdkProxy proxy = new MyJdkProxy(target1); target1 = (Subject) proxy.newProxy(); target1.sayHallo(); target1.sayHi(); System.out.println("----------------------------"); // CGLB动态接口代理方式 Subject target2 = new SubjectImpl(); MyCgljProxy myCgljProxy = new MyCgljProxy(target2); target2 = (Subject) myCgljProxy.newProxy(); target2.sayHi(); target2.sayHallo();
Th4:测试结果
总结:
当然这些只是简单的代理,感觉其实一通百通,目的都是为对象提供个代理来控制对其的访问,而我们的代理类则委托预处理、过滤、转发消息,以及委托后进行的后续处理,解决了在直接访问对象时可能带来的问题
革命尚未成功,同志仍需努力~~~~
以上是关于初识代理——Proxy的主要内容,如果未能解决你的问题,请参考以下文章