前言

代理是基本的设计模式之一,它是你为了提供额外的或者不同的操作,而插入的用来代替“实际”对象的对象。这些操作通常涉及与“实际”对象的通信,因此代理通常充当这中间人的角色。代理这种设计模式是不通过直接访问被代理的对象的方式,而访问被代理对象的方法。

JDK动态代理

在Java的动态代理机制中,有两个重要的类或接口。分别是:

  • InvocationHandler(Interface)
  • Proxy(Class)

JDK动态代理的实现实在运行时,根据一组接口定义,使用Proxy、InvocationHandler等工具类去生成一个代理类和代理类实例。

JDK动态代理代码样例

代理测试接口

这里写了一个简单的接口

/**
 * 代理测试接口
 */
public interface UserDao {
    // 定义一个接口 UserDao, 接口中有一个方法 add,
    // 方法参数 String
    // 模拟数据库的添加操作
    void add(String str);
}

代理类:Agent

/**
 * 代理类: Agent
 */

// Agent首先需要实现接口InvocationHandler(调用处理程序)
public class Agent implements InvocationHandler {

    // 重写invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 代理类当中的各项操作
        System.out.println(proxy.getClass().getName());
        System.out.println("调用方法之前,代理做的操作。。。");
        System.out.println("调用方法:" + method.getName());
        if (args != null && args.length >= 1) {
            System.out.println("方法的参数:" + args[0].getClass().getName());
        }
        System.out.println("调用方法之后,代理做的操作。。。");
        return null;
    }

    // 自定义一个getProxy方法, 方法需要一个参数, 这里是泛型类参数, 返回值同样为泛型
    // return 的时候进行一次强转
    public static <T> T getProxy(Class<T> clazz) {
        Agent agent = new Agent();
        // 创建代理实例
        return (T) Proxy.newProxyInstance(Agent.class.getClassLoader(), new Class[]{clazz}, agent);
    }
}

代理测试类

/**
 * 测试类
 */
public class Client {
    public static void main(String[] args) {
        // 意思即为生成一个代理, 用来对 UserDao 进行代理。
        UserDao userDao = Agent.getProxy(UserDao.class);
        userDao.add("【这是需要持久化的数据】");
    }
}

运行结果

输出如下:

com.sun.proxy.$Proxy0
调用方法之前,代理做的操作。。。
调用方法:add
方法的参数:java.lang.String
调用方法之后,代理做的操作。。。

也可以编写不同的接口,然后用Agent代理类加以操作。

分类: Java

Deng Jia

Keep Moving.

0 条评论

发表评论

电子邮件地址不会被公开。