温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Proxy代理在Java开发中的应用

发布时间:2025-02-12 09:34:18 阅读:93 作者:小樊 栏目:编程语言
Java开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

Java中的代理模式是一种常见的设计模式,它允许通过代理对象来控制对目标对象的访问。代理模式可以在不修改目标对象代码的情况下,扩展其功能,广泛应用于权限控制、日志记录、延迟加载等场景。

静态代理

静态代理在编译时就已经确定了代理类和真实类的关系。例如,实现一个UserService接口,通过代理类UserServiceProxy来控制对UserServiceImpl的访问,并在代理类中添加日志记录功能。

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

public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("User added: " + name);
    }
}

public class UserServiceProxy implements UserService {
    private final UserService userService;

    public UserServiceProxy(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void addUser(String name) {
        System.out.println("[LOG] Adding user...");
        userService.addUser(name);
        System.out.println("[LOG] User added.");
    }
}

public class StaticProxyDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceProxy(new UserServiceImpl());
        userService.addUser("Alice");
    }
}

动态代理

动态代理在运行时动态生成代理类,通过java.lang.reflect.Proxy类和InvocationHandler接口实现。动态代理更加灵活,适用于目标对象没有实现接口的情况。

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

public class UserServiceDynamicProxy implements InvocationHandler {
    private final Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("[LOG] Method " + method.getName() + " is called");
        Object result = method.invoke(target, args);
        System.out.println("[LOG] Method " + method.getName() + " execution completed");
        return result;
    }

    public static Object createProxy(Object target) {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new UserServiceDynamicProxy(target));
    }
}

public class DynamicProxyDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserService proxy = (UserService) UserServiceDynamicProxy.createProxy(userService);
        proxy.addUser("John Doe");
    }
}

应用场景

  1. 日志记录:在方法调用前后记录日志,便于调试和监控。
  2. 权限控制:在方法调用前检查用户权限,确保只有有权限的用户才能执行特定操作。
  3. 事务管理:在方法执行前后管理事务的开始、提交或回滚。
  4. 性能监控:统计方法执行时间,帮助优化应用性能。

动态代理在许多实际开发场景中都有广泛应用,例如在Spring框架中通过动态代理实现AOP(面向切面编程),使得横切关注点如日志记录、事务管理等可以集中管理和复用。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×