动态代理

来源:互联网 发布:冰川网络官网 编辑:程序博客网 时间:2024/06/04 19:48

注:本文为阅读《疯狂Java讲义》第3版(李刚)一书后的学习笔记, 特此说明。
(关于动态代理 及 AOP的知识点,在这本书中都讲得挺好的,可以参考原书P842-848)


使用Proxy和InvocationHandler创建动态代理

在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。

Proxy提供了用于创建动态代理类和动态代理对象的静态方法,它也是所有动态代理类的父类。如果需要在程序中为一个或多个接口动态地生成实现类,就可以使用Proxy来创建动态代理类;如果需要为一个或多个接口动态地创建实例,也可以使用Proxy来创建动态代理实例。

这里写图片描述

实际上,即使采用第一个方法生成动态代理类之后,如果程序需要通过该代理类来创建对象,依然需要传入一个InvocationHandler对象。也就是说,系统生成的每个代理对象都有一个与之关联的InvocationHandler对象。

在定义InvocationHandler的实现类时,需要重写invoke()方法,调用代理对象的所有方法时,都会被替换成调用该invoke()方法。


这里写图片描述

示例(该例子来自《疯狂Java讲义》):

interface Person{    void walk();    void sayHello(String name);}class MyInvokationHandler implements InvocationHandler{    /*    执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法    其中:    proxy:代表动态代理对象    method:代表正在执行的方法    args:代表调用目标方法时传入的实参。    */    public Object invoke(Object proxy, Method method, Object[] args)    {        System.out.println("----正在执行的方法:" + method);        if (args != null)        {            System.out.println("下面是执行该方法时传入的实参为:");            for (Object val : args)            {                System.out.println(val);            }        }        else        {            System.out.println("调用该方法没有实参!");        }        return null;    }}public class ProxyTest{    public static void main(String[] args)        throws Exception    {        // 创建一个InvocationHandler对象        InvocationHandler handler = new MyInvokationHandler();        // 使用指定的InvocationHandler来生成一个动态代理对象        Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader()            , new Class[]{Person.class}, handler);        // 调用动态代理对象的walk()和sayHello()方法        p.walk();        p.sayHello("孙悟空");    }}

运行结果:

这里写图片描述

0 0
原创粉丝点击