Java代理

来源:互联网 发布:淘宝这那样下架商品 编辑:程序博客网 时间:2024/06/05 13:27

简单介绍三种代理方式,如果有不清楚的地方可以+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();}