java 静态代理 动态代理 cglib代理

参考资料:Java三种代理模式:静态代理、动态代理和cglib代理


 代理的目的就是为了增强功能  基本套路 为目标类生成代理对象,然后通过代理对象实现增强

 静态代理
 一个接口
 实现接口的目标类
 实现接口的代理类

 目标类和代理类都实现接口中的方法
 代理类构造函数的参数为接口,方便目标类的接入
 代理类中实现的方法即在目标类之前和之后增强目标类中的方法

 动态代理
 一个接口
 一个目标类
 一个动态代理类 该类需要为目标对象生成代理对象
 static Object Proxy.newProxyInstance(目标对象使用类加载器,                          目标对象实现的接口类型 ,                     事件处理器) 返回一个代理实例

 static Object Proxy.newProxyInstance(ContractServiceImpl.class.getClassLoader(), ContractServiceImpl.class.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 null;
     }
 });

 动态代理和静态代理的思路一样,
 静态代理在编译时就固定了,不易于扩展(目标类和代理类必须实现同一个接口,一旦接口增加方法则目标类和代理类都要修改)
 动态代理在运行时动态生成字节码并加载到jvm中

 cglib代理
 cglib是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展
 一个目标类
 一个代理类
 代理类实现MethodInterceptor方法拦截器接口,拦截目标类的方法,然后做功能增强

 class ProxyFactory  implements MethodInterceptor {
    
    private Object target; //目标类对象
    
    public ProxyFactory(Object target) {
        this.target = target;
    }
    
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("方法开始前增强的操作");
        // 执行目标对象的方法
        Object returnValue = method.invoke(target, args);
        System.out.println("方法结束后增强的操作");
        return null;
    }
}


 
	总结:静态代理实现较简单,只要代理对象对目标对象进行包装,即可实现增强功能,但静态代理只能为一个目标对象服务,如果目标对象过多,则会产生很多代理类。
JDK动态代理需要目标对象实现业务接口,代理类只需实现InvocationHandler接口。
动态代理生成的类为 lass com.sun.proxy.\$Proxy4,cglib代理生成的类为class com.cglib.XXClass\$\$EnhancerByCGLIB\$\$552188b6。
静态代理在编译时产生class字节码文件,可以直接使用,效率高。
动态代理必须实现InvocationHandler接口,通过反射代理方法,比较消耗系统性能,但可以减少代理类的数量,使用更灵活。
cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值