动态代理 Proxy.newProxyInstance

动态代理使用

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利用传入参数,运行时动态生成被代理类的实际对象(如何利用传入参数生成对象,涉及的知识点是类加载过程)。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Proxy.newProxyInstance` 是 Java 中的一个方法,用于创建一个动态代理对象。它接受三个参数:一个类加载器,一个接口数组和一个 `InvocationHandler` 对象。动态代理对象可以在运行时动态地创建一个实现指定接口的代理类,并将方法调用委托给 `InvocationHandler` 来处理。 使用 `Proxy.newProxyInstance` 可以实现一些横切关注点(cross-cutting concerns)的功能,比如日志记录、性能监控、事务管理等。通过动态代理,可以在不修改原始类代码的情况下,为其增加额外的行为。 以下是一个简单的示例代码,演示如何使用 `Proxy.newProxyInstance` 创建一个动态代理对象: ```java public interface Foo { void bar(); } public class RealFoo implements Foo { @Override public void bar() { System.out.println("RealFoo: executing bar()"); } } public class LoggingHandler implements InvocationHandler { private final Object target; public LoggingHandler(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 Main { public static void main(String[] args) { Foo realFoo = new RealFoo(); InvocationHandler handler = new LoggingHandler(realFoo); Foo proxy = (Foo) Proxy.newProxyInstance( Foo.class.getClassLoader(), new Class[]{Foo.class}, handler); proxy.bar(); // 通过代理对象调用方法 } } ``` 运行上述代码,将会在控制台输出以下内容: ``` Before method: bar RealFoo: executing bar() After method: bar ``` 这说明 `LoggingHandler` 在方法调用前后添加了额外的日志输出行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值