动态代理三种实现方式 与及案例分析

本文介绍了Java中动态代理的三种实现方式:静态代理、JDK动态代理和CGLIB动态代理。静态代理通过继承或实现相同接口创建代理类,而动态代理则在运行时动态生成字节码实现代理。JDK动态代理基于接口,CGLIB动态代理则通过子类化目标对象来实现。通过动态代理,可以在不修改目标对象代码的情况下增强其行为。

动态代理三种实现方式

  • 静态代理
  • 动态代理
    • jdk动态代理
    • cglib动态代理 jar包

静态代理

​ 某个对象提供⼀个代理,代理⻆⾊固定,以控制对这个对象的访问。 代理类和委托类有共同的⽗类或

⽗接⼝,这样在任何使⽤委托类对象的地⽅都可以⽤代理对象替代。代理类负责请求的预处理、过滤、

将请求分派给委托类处理、以及委托类执⾏完请求后的后续处理。

调用代理的方法{

​ 方法前加强。

​ 对象实现的方法。

​ 方法后加强。

}

案例:

行为接口:结婚

顾客:Lff

代理:增强Lff结婚

//行为接口
public interface Marry {
 	public void toMarry();
}

//顾客
public class Lff implements Marry{
    @Override
    public void toMarry(){
        System.out.println("罗飞飞结婚了");
    }
}

//代理
public class StaticProxy implements Marry{
    
    private Marry marry;//结婚需求的对象
    
    public StaticProxy(Marry marry){
        this.marry=marry;
    }
    @Override
    public void toMarry(){
        System.out.println("找到了婚庆公司,准备好了婚礼。");
        marry.toMarry();
        System.out.println("洞房花烛夜。。。。。");
    }
}

动态代理

​ 相比于静态代理,动态代理在创建代理对象上更加的灵活,动态代理类的字节码在程序运行时,由Java反射机制动态产生。它会根据需要,通过反射机制在程序运行期,动态的为目标对象创建代理对象,无需程序员手动编写它的源代码。动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为反射机制可以生成任意类型的动态代理类。代理的行为可以代理多个方法,即满足生产需要的同时又达到代码通用的目的。

特点:

  1. 目标对象不固定
  2. 在应用程序执行时动态创建目标对象
  3. 代理对象会增强目标对象的行为

jdk 代理 动态实现接口代理商

//行为接口
public interface Marry {
 	public void toMarry();
}

//顾客
public class Lff implements Marry{
    @Override
    public void toMarry(){
        System.out.println("罗飞飞结婚了");
    }
}

//代理
public class LffProxy {

    public static Object getProxyBean(Object obj){
        Class clazz = obj.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {
            //生成的代理对象的方法
            /**
             *
             * @param proxy 代理对象
             * @param method 目标类的行为方法
             * @param args 目标类行为方法的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        		System.out.println("找到了婚庆公司,准备好了婚礼。");
                //目标类 Lff的行为方法执行
                Object invoke = method.invoke(obj, args);
       			System.out.println("洞房花烛夜。。。。。");
                return invoke;
            }
        });
    }
}

cglib动态代理 动态实现子类代理商

导入包

<dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib-full</artifactId>
      <version>2.0.2</version>
</dependency>
//顾客
public class Lff{
    public void toMarry(){
        System.out.println("罗飞飞结婚了");
    }
}

//代理
public class LffProxy {

     public static Object getProxyBean(Object obj){
        //代理对象的模板
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            /**
             *
             * @param o 代理对象
             * @param method 目标行为方法
             * @param objects 目标行为方法参数
             * @param methodProxy 目标行为方法的代理对象
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        		System.out.println("找到了婚庆公司,准备好了婚礼。");
                Object invoke = method.invoke(obj, objects);
       			System.out.println("洞房花烛夜。。。。。");
                return invoke;
            }
        });
        //生成代理对象
        return enhancer.create();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值