动态代理

  • 动态代理和静态代理角色一样
  • 动态代理的代理类是动态生成的
  • 动态代理分为两大类:基于接口和基于类
    • 基于接口的:JDK动态代理
    • 基于类: cglib
    • java字节码:javasist

需要了解两个类: Proxy 代理, InvocationHandler 调用处理程序

动态代理的好处:

  • 一个动态代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类

1.建立一个接口

package com.shao.demo04;

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

2.接口的实现类

package com.shao.demo04;

public class UserServiceImpl implements UserService {
    public void add(){
        System.out.println("增加了一个用户");
    };
    public void delete(){
        System.out.println("删除了一个用户");
    };
    public void update(){
        System.out.println("改变了一个用户");
    };
    public void query(){
        System.out.println("查询了一个用户");
    };
}

3.代理类

package com.shao.demo04;

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

public class UserServiceProxy implements InvocationHandler {
	//被代理的接口
    private UserService userService;
	//生成接口实现的对象
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
	//生成代理对象
    public Object getProxy(){
		 //参数分别是类加载器,代理类的接口,第三个是InvocationHandler
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                userService.getClass().getInterfaces(),
                this);
    }
	//处理代理实例并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//执行代理上面的方法。动态代理的本质
        log(method.getName());
        Object result = method.invoke(userService, args);
        return result;
    }
    public void log(String msg){
        System.out.println("使用了"+msg+"方法");
    }

}

4.测试

package com.shao.demo04;

public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        UserServiceProxy handler = new UserServiceProxy();
        handler.setUserService(userService);
        UserService proxy = (UserService) handler.getProxy();
        proxy.add();
    }
}

posted @   蘑菇王国大聪明  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示