温馨提示×

温馨提示×

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

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

Java Proxy代理是什么

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

Java中的代理模式是一种设计模式,它允许通过在对象之间添加一个代理对象来控制对对象的访问。代理对象可以在调用真实对象的方法前后添加一些额外的逻辑,例如日志记录、权限控制、性能监控等。

静态代理

静态代理是在编译期就已经确定代理类和被代理类的关系。代理类是手动编写的,并且只为特定的被代理类服务。这种方式的优点是实现简单,容易理解;缺点是如果有多个被代理类,就需要编写大量重复的代理类代码。

动态代理

动态代理是在运行时动态生成代理类。Java提供了java.lang.reflect.Proxy类来支持动态代理。动态代理可以为多个不同的被代理类创建代理对象,只需要编写一个通用的InvocationHandler

动态代理的核心在于Proxy类和InvocationHandler接口。Proxy类允许在运行时创建代理对象,而InvocationHandler接口则定义了代理对象调用方法时的具体行为。

示例代码

以下是一个简单的动态代理示例:

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

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

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

    @Override
    public void deleteUser(String user) {
        System.out.println("Deleting user: " + user);
    }
}

class UserServiceInvocationHandler implements InvocationHandler {
    private Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After method: " + method.getName());
        return result;
    }
}

public class ProxyDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserServiceInvocationHandler handler = new UserServiceInvocationHandler(userService);
        UserService proxy = (UserService) Proxy.newProxyInstance(
            userService.getClass().getClassLoader(),
            new Class[]{UserService.class},
            handler
        );
        proxy.addUser("John Doe");
        proxy.deleteUser("John Doe");
    }
}

输出结果:

Before method: addUser
Adding user: John Doe
After method: addUser
Before method: deleteUser
Deleting user: John Doe
After method: deleteUser

通过上述示例可以看出,动态代理使得我们可以在运行时动态地为对象添加功能,而无需修改原始类的代码,这大大提高了代码的灵活性和可维护性。

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

向AI问一下细节

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

AI

开发者交流群×