java jdk动态代理详解

Java 动态代理是在运行时生成代理对象的技术。它可以对目标对象进行增强,在保留原有方法的同时,提供额外的功能。Java 动态代理主要涉及三个角色:

1. 接口:代理对象和目标对象要实现的共同接口。

2. 目标对象:被代理的实际对象。

3. 代理对象:代理目标对象,增强原有方法并提供额外方法。

代理对象包括:代理类:实现与目标对象相同的接口,用于关联目标对象并增强方法。

InvocationHandler:创建代理对象并定义要增强的方法。

Proxy:创建代理对象。实现动态代理的主要步骤:

1. 定义公共接口

interface UserService {
    void addUser(String name);
    void deleteUser(String name); 
}

2. 实现接口并定义目标对象

class UserServiceImpl implements UserService {
    public void addUser(String name) {
        System.out.println("Add user " + name);
    }
    public void deleteUser(String name) {
        System.out.println("Delete user " + name);
    }
} 

3. 实现 InvocationHandler 并定义增强方法

class ProxyHandler implements InvocationHandler {
    private Object target; // 目标对象

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
        System.out.println("Before method " + method.getName());
        method.invoke(target, args);  // 执行目标方法
        System.out.println("After method " + method.getName());
        return null;
    }
}

4. 使用 Proxy 创建代理对象

UserService userService = (UserService) Proxy.newProxyInstance(
                    target.getClass().getClassLoader(), 
                    target.getClass().getInterfaces(),
                    new ProxyHandler(target)); 

5. 使用代理对象调用方法

UserService userService = ...;  // 获取代理对象
userService.addUser("John");   // 调用代理方法

输出结果:

Before method addUser

Add user John

After method addUser

可以看到,代理对象增强了目标方法,在方法前后添加了额外逻辑。这就是 Java 动态代理的作用。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论