Java动态代理

Java动态代理

解决方案goocz2025-06-24 14:28:254A+A-

Java动态代理

动态代理是Java中一种强大的机制,允许在运行时创建代理对象,用于在方法调用前后插入自定义逻辑,而无需修改原始类代码。

核心概念

动态代理的组成

  • Proxy类:java.lang.reflect.Proxy,用于创建动态代理实例
  • InvocationHandler接口:定义代理实例的方法调用如何被处理
  • 被代理的接口:代理对象将实现的接口

基本实现步骤

  1. 定义一个实现InvocationHandler接口的类
  2. 使用Proxy.newProxyInstance()方法创建代理对象
  3. 通过代理对象调用方法

代码示例

// 1. 定义接口

package org.example;

interface UserService {
    void save();

    String find(String name);
}

// 2. 实现类

package org.example;

class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用户数据");
    }

    @Override
    public String find(String name) {
        return "查找用户: " + name;
    }

}

// 3. 实现InvocationHandler

package org.example;

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

public class MyInvocationHandler implements InvocationHandler {
    private Object target; // 被代理的对象

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法调用前: " + method.getName());
        // 调用原始方法
        Object result = method.invoke(target, args);
        System.out.println("方法调用后");
        return result;
    }
}



package org.example;

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

public class DynamicProxyDemo {
    public static void main(String[] args) {
        // 创建被代理对象
        UserService userService = new UserServiceImpl();

        // 创建InvocationHandler
        InvocationHandler handler = new MyInvocationHandler(userService);

        // 创建代理对象
        UserService proxy = (UserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), handler);

        // 通过代理对象调用方法
        proxy.save();
        System.out.println(proxy.find("李四"));
    }

}

输出结果

方法调用前: save
保存用户数据
方法调用后
方法调用前: find
方法调用后
查找用户: 李四

动态代理的特点

  • 运行时创建:代理类是在运行时动态生成的
  • 基于接口:只能代理接口,不能代理类
  • AOP实现基础:Spring AOP等框架的基础实现方式
  • 性能考虑:由于使用反射,性能比直接调用稍低

动态代理的应用场景

  • 日志记录
  • 事务管理
  • 权限控制
  • 性能监控
  • 远程方法调用(RPC)

注意事项

  • 动态代理只能代理接口,不能代理类
  • 若需要代理类,可以考虑使用CGLIB等字节码增强库
  • 过度使用动态代理可能会影响性能
  • 调试代理代码可能比较困难

小结

动态代理是Java反射机制的重要应用,也是许多框架(如Spring)实现AOP功能的基础技术。

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5