Java教程

java--动态代理学习笔记

本文主要是介绍java--动态代理学习笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

动态代理学习笔记

  • 什么是代理设计模式?
  • 为什么使用动态代理?
  • 练习Demo
    • interface UserService
    • class UserServiceImpl
    • class ProxyInvocationHandler
    • 调用

什么是代理设计模式?

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

为什么使用动态代理?

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

练习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--动态代理学习笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!