java--动态代理学习笔记

Posted HardyDragon_CC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--动态代理学习笔记相关的知识,希望对你有一定的参考价值。

什么是代理设计模式?

分为静态代理和动态代理。将原有业务代码不变更作为原则,通过代理类来实现对原有业务的功能扩展。

为什么使用动态代理?

使用动态代理解决静态代理需要手写多个代理类应对不同业务的情况

练习Demo

在这里插入图片描述

interface UserService

package ProxyDemo;

public interface UserService {
    void add();

    void delete();

    void update();

    void query();
}

class UserServiceImpl

package ProxyDemo;

/**
 * @Description: 接口实现类
 * @author: HardyDragon
 * @date: 2021年07月14日 16:31
 */
public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("add succ");
    }

    @Override
    public void delete() {
        System.out.println("delete succ");

    }

    @Override
    public void update() {
        System.out.println("update succ");

    }

    @Override
    public void query() {
        System.out.println("query succ");

    }
}

class ProxyInvocationHandler

利用 Proxy类生成代理实例,传入

loader – 定义代理类的类加载器(反射有关知识点)
接口 - 代理类要实现的接口列表
h – 将方法调用分派到的调用处理程序

返回:
具有代理类的指定调用处理程序的代理实例,该代理类由指定的类加载器定义并实现指定的接口

package ProxyDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description: 利用 Proxy 和 实现 InvocationHandler 接口重写 invoke 方法,实现设置生成动态代理类
 * @author: HardyDragon
 * @date: 2021年07月14日 16:22
 */
public class ProxyInvocationHandler implements InvocationHandler {

    // 要被代理的接口
    private Object target;

    // 设置要被代理的接口
    public void setTarget(Object target) {
        this.target = target;
    }

    // 获取生成的动态代理类
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    // 处理代理实例 额外操作
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        Object res = method.invoke(target, args);
        return res;
    }

    // 通过代理类添加额外的业务
    public void log(String msg) {
        System.out.println("[Debug]执行了" + msg + "方法!");
    }

}

调用

package ProxyDemo;

/**
 * @Description: 使用动态代理解决静态代理 需要手写多个代理类应对不同业务的情况
 * @author: HardyDragon
 * @date: 2021年07月14日 16:30
 */
public class Client {
    public static void main(String[] args) {
        // 真实对象,要被代理的对象,纯粹的业务
        UserServiceImpl userService = new UserServiceImpl();

        // 动态生成的代理类
        ProxyInvocationHandler pih = new ProxyInvocationHandler();

        // 给代理类设置要代理的对象
        pih.setTarget(userService);

        // 得到生成的代理类
        UserService proxy = (UserService) pih.getProxy();

        proxy.add();
        proxy.delete();
        proxy.update();
        proxy.query();
    }
}

result

[Debug]执行了add方法!
add succ
[Debug]执行了delete方法!
delete succ
[Debug]执行了update方法!
update succ
[Debug]执行了query方法!
query succ

Process finished with exit code 0

以上是关于java--动态代理学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Java 动态代理 学习笔记

Java_JDK动态代理学习笔记

Spring学习笔记7:静态动态代理模式

AOP 学习笔记

设计模式学习笔记---结构型---代理模式

设计模式学习笔记---结构型---代理模式