Java-JDK动态代理复习总结

本文主要介绍了Java代理模式,包括静态代理和动态代理。重点讲解了JDK动态代理的实现原理,强调动态代理无需手动创建代理类,目标类必须实现接口。通过InvocationHandler接口和Proxy类来创建和执行代理对象,实现功能增强。最后,概述了实现动态代理的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.代理模式:

答:当一个对象不能直接使用,可以在客户端和目标对象之间创建一个中介,这个中介就是代理

 作用:控制访问: 在代理中,控制是否可以调用目标对象的方法

            功能增强: 功能增强,可以在完成目标对象的调用时,附加一些额外的功能,这些额外的功能叫做功能增强。

静态代理:代理类是手工实现的java文件,同时代理的目标对象是固定的。

 优点:容易理解,使用方便

 缺点:在目标类比较多的时候,会产生大量的代理类;当接口改变时,影响的目标类和代理比较多,都需要修改

2.什么是动态代理?

答:使用JDK的反射机制,创建对象的能力,创建的是代理类的对象。而不用你创建类文件,也就是.java文件。代理的目标类是活动的,可设置的。

       动态:在程序执行时,调用JDK提供的方法才能创建代理类的对象。

       jdk动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用cglib动态代理

       特点:1.不用创建代理类 2.可以给不同的目标随时创建代理

动态代理的实现:1.jdk动态代理(理解):使用java反射包中的类和接口实现动态代理的功能

                                    反射包:java.lang.reflect ,里面有三个类:InvocationHandler,method,Proxy.

                             2.cglib动态代理(了解):cglib是第三方的工具库,创建代理对象。

                                    cglib的原理是继承,cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法,实现功能的修改。

                                    因为cglib是继承,重写方法,所以要求目标类不能是final的,方法也不能是final的

  3.jdk动态代理:

   1.反射,Method类,表示方法。类中的方法。通过method可以执行某个方法。

   2.jdk动态代理的实现

       1)InvocationHandler 接口(调用处理器)   就一个  invoke():表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke()方法中。

         代理类完成的功能:1、调用目标方法,执行目标方法的功能

                                          2、功能增强,在目标方法调用时,增加功能。

        方法原型:  

    参数:Object proxy:jdk创建的代理对象,无需赋值。  
          Method method:目标类中的方法,jdk提供method对象的
          Object[] args:目标类中方法的参数,jdk提供的。     
    public Object invoke(Object proxy, Method method, Object[] args)

    怎么用:1、创建InvocationHandler 2、重写invoke()方法,把原来静态代理中代理类要完成的功能,写在这   

       2) Method类:表示方法的,确切的说就是目标类中的方法。

            作用:通过Method可以执行某个目标类的方法,Method.invoke();

       3)Proxy类:核心的对象,创建代理对象。之前创建对象都是new 类的构造方法()

                   现在我们是使用Proxy类的方法,代替new的使用。

           方法:静态方法 newProxyInstance()

           作用是:创建代理对象,等同于静态代理创建代理对象(TaoBao taoBao = new TaoBao();)

           参数:

           1.  ClassLoader loader 类加载器,负责向内存中加载对象的。使用反射获取对象的ClassLoader

                类a,a.getClass().getClassLoader() ,目标对象的类加载器

           2.Class<?>[] interfaces:接口,目标对象实现的接口,也是反射获取的。

           3. InvocationHandler h:我们自己写的,代理类要完成的功能。

           返回值:就是代理对象

           public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

    3.实现动态代理的步骤:

          1.创建接口,定义目标类要完成的功能

          2.创建目标类实现接口

          3.创建InvocationHandler接口的实现类,在invoke方法中完成代理类的功能

               1.调用目标方法

               2.增强功能

           4. 使用Proxy类的静态方法,创建代理对象。并把返回值转为接口类型 

 //com.sun.proxy.$Proxy0:这是jdk动态代理创建的对象类型。

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值