博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理设计模式
阅读量:6397 次
发布时间:2019-06-23

本文共 2247 字,大约阅读时间需要 7 分钟。

hot3.png

1、静态代理;

public class HelloProxy implements Hello {    private HelloImpl helloImpl;    public HelloProxy() {        helloImpl = new HelloImpl();    }    @Override    public void say(String name) {        before();        helloImpl.say(name);        after();    }    private void before() {        System.out.println("Before");    }    private void after() {        System.out.println("After");    }}

2、JDK 动态代理(实现InvocationHandler ):

public class DynamicProxy implements InvocationHandler {    private Object target;    public DynamicProxy(Object target) {        this.target = target;    }    @Override     //实现自己的invoke    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        before();        Object result = method.invoke(target, args);        after();        return result;    }    @SuppressWarnings("unchecked")    public 
T getProxy() { return (T) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this ); }public static void main(String[] args) { DynamicProxy dynamicProxy = new DynamicProxy(new HelloImpl()); Hello helloProxy = dynamicProxy.getProxy(); helloProxy.say("Jack");} }

3、cglib动态代理(需要引入cglib类库);

public class CGLibProxy implements MethodInterceptor {    private static CGLibProxy instance = new CGLibProxy();        private CGLibProxy() {    }    public static CGLibProxy getInstance() {        return instance;    }    public 
T getProxy(Class
cls) { return (T) Enhancer.create(cls, this); } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj, args); after(); return result; }public static void main(String[] args) { HelloImpl helloImpl = CGLibProxy.getInstance().getProxy(HelloImpl.class); helloImpl.say("Jack");}}

4、jdk动态代理和cglib动态代理比较:

(1)JDK动态代理只能针对实现了接口的类生成代理;

(2)CGLIB代理是针对类实现代理,对指定类生成一个子类,覆盖所有方法,该类或方法不能是final;

(3)jdk动态代理创建代理实现类时比CGLib要快;

(4)CGLib据说比jdk动态代理运行的快;

(5)被代理的对象是个实现类时,spring使用jdk代理;

(6)被代理的对象不是个实现类,spring使用CGLib;

转载于:https://my.oschina.net/u/3847203/blog/1810186

你可能感兴趣的文章
投简历申请数据科学岗石沉大海?这些秘密别人不会告诉你
查看>>
Scrum文化问与答
查看>>
5G一周热闻:中国5G芯片关键材料获突破,华为首款折叠屏手机亮相
查看>>
利用Diferencia和Java微服务进行分接比较测试
查看>>
Docker发布新的网络项目,并开始招聘中国区主管
查看>>
红帽峰会2018第一天:数字转型扛把子OpenShift
查看>>
LLVM 4中将加入新的LLVM链接器LLD
查看>>
后Kubernetes时代的微服务
查看>>
IBM 收购 StrongLoop,拓展云端服务业务
查看>>
ArchSummit深圳2016大会7折售票最后一周
查看>>
Facebook发布JavaScript包管理器Yarn 1.0
查看>>
Pymetrics开源公平性感知机器学习算法Audit AI
查看>>
火掌柜iOS端基于CocoaPods的组件二进制化实践
查看>>
使用契约测试提高分布式系统的质量
查看>>
Beaker:一个基于Electron的点对点Web浏览器
查看>>
Devoxx 2017美国大会首日重要演讲一览
查看>>
eBay是如何进行大数据集元数据发现的
查看>>
美团全链路压测自动化实践
查看>>
LFE将Lisp编程带到Erlang虚拟机上
查看>>
微软自夸Edge浏览器的电源效率
查看>>