Java代理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值