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

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

1. 静态代理:

1-1. interface

public interface Hello {    public void talk();}

1-2. some impl class

public class HelloImpl implements Hello {    @Override    public void talk() {        System.out.println("hi, helloImpl.");    }}

1-3. some proxy class

public class HelloProxy implements Hello {    private Hello hello;    public HelloProxy(){        hello = new HelloImpl();    }    @Override    public void talk() {        before();        hello.talk();        after();    }    private void after() {        System.out.println("do something after talk...");            }    private void before() {        System.out.println("do something before talk...");    }    public static void main(String[] args) {        HelloProxy hProxy = new HelloProxy();        hProxy.talk();    }}

 

2. JDK动态代理

2-1 dynamic proxy class(1.0 version)

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynamicProxy implements InvocationHandler {    private Object target;    public DynamicProxy (Object target){        this.target = target;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        before();        Object result = method.invoke(target, args);        after();        return result;            }    private void after() {        System.out.println("after ...");    }    private void before() {        System.out.println("before....");    }}

2-2. 测试

import java.lang.reflect.Proxy;public class TestProxy {    public static void main(String[] args) {        Hello hello = new HelloImpl();        DynamicProxy dProxy = new DynamicProxy(hello);        Hello helloProxy = (Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(),                              hello.getClass().getInterfaces(),                               dProxy);        helloProxy.talk();    }}

2-3. dynamic proxy class(2.0 version)

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler {    private Object target;    public DynamicProxy (Object target){        this.target = target;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        before();        Object result = method.invoke(target, args);        after();        return result;            }    public 
T getProxy(){ return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } private void after() { System.out.println("after ..."); } private void before() { System.out.println("before...."); }}

2-4 Test

import java.lang.reflect.Proxy;
public class TestProxy {
    public static void main(String[] args) {
        DynamicProxy dProxy = new DynamicProxy(new HelloImpl());
        Hello helloProxy = dProxy.getProxy();
        helloProxy.talk();
    }
}

 

3 CGLIB动态代理

jdk动态代理是基于接口的, 如果一个类没有实现任何接口,这时就不管用了

3-1. CGLib代理类

cglib 提供的是方法级别的代理,也可以理解为对方法的拦截

import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CGLibProxy implements MethodInterceptor {    @SuppressWarnings("unchecked")    public 
T getProxy(Class
cls){ return (T) Enhancer.create(cls, this); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj, args); after(); return result; } private void after() { // TODO Auto-generated method stub } private void before() { // TODO Auto-generated method stub }}

3-2. Test

这里不需要任何的接口信息

public class TestCLIib {    public static void main(String[] args) {        CGLibProxy cgLibProxy = new CGLibProxy();        HelloImpl helloProxy = cgLibProxy.getProxy(HelloImpl.class);        helloProxy.talk();    }}

需要引入asm的相关jar, 引用asm-5.1.2.jar时报错, 引用com.springsource.org.objectweb.asm-3.2.0.jar可以

转载于:https://www.cnblogs.com/rocky-fang/p/5454773.html

你可能感兴趣的文章
数据库的本质、概念及其应用实践(二)
查看>>
iOS开发多线程--(NSOperation/Queue)
查看>>
php的ajax简单实例
查看>>
maven常用构建命令
查看>>
C#:关联程序和文件
查看>>
推荐科研软件
查看>>
gradle
查看>>
如何取消未知类型文件默认用记事本打开
查看>>
[Javascript] Immute Object
查看>>
Java 关于finally、static
查看>>
Posix mq和SystemV mq区别
查看>>
P6 EPPM Manual Installation Guide (Oracle Database)
查看>>
XMPP协议、IM、客户端互联详解
查看>>
PHP写文件函数
查看>>
mysql的sql_mode合理设置
查看>>
函数连续性与可导性
查看>>
linux下libevent安装
查看>>
用ip来获得用户所在地区信息
查看>>
卡尔曼滤波
查看>>
linux下面覆盖文件,如何实现直接覆盖,不提示
查看>>