首页 » Java » Java代理

Java代理

原文 http://blog.csdn.net/cat_pp/article/details/76419844

2017-07-31 11:20:11阅读(644)

简单介绍三种代理方式,如果有不清楚的地方可以+QQ:3393055725
Java三种代理方式:静态代理,动态代理(JDK代理),cglib代理

1、静态代理:
静态代理的实现方式很简单,但是用到的不多,静态代理和动态代理使用的前提都是目标对象要实现接口,每个目标对象都要对应一个代理类

//目标对象接口
public interface ITarget {
    void fun();
}
//目标对象
public class Target implements ITarget {
    @Override
    public void fun() {
        System.out.println("调用目标对象方法");
    }
}
//代理类
public class StaticProxy implements ITarget {//实现和目标对象相同的接口
    private ITarget target;//目标对象
    //通过构造函数创建代理对象
    public StaticProxy(ITarget target) {//传参:接口对象
        this.target = target;
    }
    @Override
    public void fun() {
        System.out.println("静态代理开始");
        target.fun();
        System.out.println("静态代理结束");
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        //目标对象
        ITarget target = new Target();
        ITarget proxy = new StaticProxy(target);
        proxy.fun();
    }
}

2、动态代理
动态代理用到的更多一些,但是目标对象要实现接口,因为动态代理的实现需要传入接口类型, 不需要每个目标对象都对应一个代理类

//省略目标对象的接口和实现类
//...参考静态代理
//动态代理类
public class DynamicProxy {
    //目标对象
    private Object target;
    public DynamicProxy (Object target) {
        this.target = target;
    }
    //生成代理对象
    public Object getProxy() {
        return Proxy.newProxyInstance(//三个参数
            target.getClass().getClassLoader(),//类加载器
            target.getClass().getInterfaces(),//目标对象接口类
            new InvocationHandler(){//事件处理器
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("动态代理开始");
                    Object returnValue = method.invoke(target, args);
                    System.out.println("动态代理结束");
                    return returnValue;
                }
            });
    }
}
//测试类
public class Test {
    ITarget target = new Target();
    ITarget proxy = (ITarget) new DynamicProxy(ITarget target).getProxy();
    proxy.fun(); 
}

3、cglib代理
cglib代理不需要目标对象实现接口,所以当目标对象没有实现接口的前提下可以使用cglib代理,使用cglib代理要引入jar包,在web工程中spring-core.jar文件中包含cglib代理文件
实现原理是为目标对象创建子类对象

// 省略目标对象类,参考静态代理实现类,但是不实现接口即可
// 实现cglib代理
public class CgligProxy implements MethodInterceptor{//实现MethodInterceptor接口
    // 目标对象
    private Object target;
    public CglibProxy(Object target) {
        this.target = target;
    }
    // 为目标对象创建代理对象
    public Object getProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.serCallback(this);
        return enhancer.create();
    }
    // 重写拦截方法
    @Override
    public Object intercept(Object obj, Method method, Objects[] orgs, MethodProxy proxy) throw Throwable {
        System.out.println("cglib代理开始");
        Object returnValue = method.invoke(target, orgs);
        System.out.println("cglib代理结束");
        return returnValue;
    }
}
// 测试类
public class Test{
    // 目标对象
    Target target = new Target();//这里的不是接口对象,是类对象
    // 代理对象
    Target proxy = (Target) new ProxyFactory(target).getProxy();
    proxy.fun();
}

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹