25、动态代理

学习目标:

1、掌握JDK原生的动态代理的支持

2、了解动态代理的意义

学习过程:

动态代理的目的就是为了解决静态代理的缺点。通过使用动态代理,我们可以通过在运行时,动态生成一个持有Object、并实现代理接口的Proxy,同时注入我们相同的扩展逻辑。哪怕你要代理的Object是不同的对象,甚至代理不同的方法,都可以动过动态代理,来扩展功能。

动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。

动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable

我们看到这个方法一共接受三个参数:

proxy:是指我们所代理的那个真实对象

method:是我们所要调用真实对象的某个方法的Method对象

args:指代的是调用真实对象某个方法时接受的参数

Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:

下面我们简单做一个示例:

业务接口:

1

2

3

4

5

6

7

public interface EmployeeBiz {

     

    public String hello();

     

    public String hi(String name) ;

 

}

实现类:

1

2

3

4

5

6

7

8

9

10

public class EmployeeBizImpl implements  EmployeeBiz{

    public String hello() {

        System.out.println("业务方法");

        return "Hello";

    }

     

    public String hi(String name) {

        return "hi"+name;

    }

}

代理控制类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class DynamicProxyHandler implements InvocationHandler {

    private Object realObject;

 

    public DynamicProxyHandler(Object realObject) {

        this.realObject = realObject;

    }

 

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //代理扩展逻辑

        System.out.println("proxy do");

 

        Object object= method.invoke(realObject, args);

         

        System.out.println("你可以在这里进行相关的扩展的");

         

        return object;

    }

}

测试类:

1

2

3

4

5

6

7

8

9

10

public class Run {

 

    public static void main(String[] args) {

        EmployeeBiz realObject = new EmployeeBizImpl();

        EmployeeBiz proxy = (EmployeeBiz) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{EmployeeBiz.class}, new DynamicProxyHandler(realObject));

        proxy.hello();

 

    }

 

}

   其实有点类似我们在静态代理中提到的方案一,生成了一个包含我们扩展功能,持有RealObject引用,实现Action接口的代理实例Proxy。只不过这个Proxy不是我们自己写的,而是java帮我们生成的,有没有一点动态的味道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值