动态代理 Proxy.newProxyInstance

本文深入解析动态代理原理,展示如何利用InvocationHandler与Proxy.newProxyInstance实现无侵入式功能增强,特别聚焦于登录验证场景中密码长度检查的动态增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态代理使用

interface UserService{
    void login(User user);
    void register(User user);
}

class UserServiceImpl implements UserService {
    @Override
    void register(User user) {
        // 这里是原本的基础业务实现
    }

    @Override
    void login(User user) {
        // 这里是原本的基础业务实现
    }
}

class UserServiceInterceptor implements InvocationHandler {
    private Object realObj;
    
    public UserServiceInterceptor(Object realObj) {
        super();
        this.realObj = realObj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(args != null && args.length > 0 && args[0] instanceof User) {
            // 无侵入式增加代码
            if(user.getName().getPassword().length() <= 6 && method.getName().equals("login")) {
                throw new RuntimeException("密码长度必须大于6");
            }
            
            Object result = method.invoke(realObj, args);
            return result;
        }
    }
}


// 如何使用
public static void main(String[] args) {
    UserService userService = new UserServiceImpl();
    InvocationHandler userServiceInterceptor = new UserServiceInterceptor(userService);

    UserService userServiceProxy = Proxy.newProxyInstance(userService.getClass().getClassLoader, userService.getClass().getInterfaces(), userServiceInterceptor);
    // 使用时直接通过userServiceProxy进行调用
    userServiceProxy.login(new User());
}

使用很简单,就是熟悉下InvocationHandler Proxy.newProxyInstance。

InvocationHandler实现了无侵入式的增加被代理类的功能,Proxy.newProxyInstance利用传入参数,运行时动态生成被代理类的实际对象(如何利用传入参数生成对象,涉及的知识点是类加载过程)。

在本人看来,动态代理最大的用处就是上面的加黑斜体:无侵入式的增加被代理类的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值