【Java】动态代理的使用

房东租房的例子

有一个房东要出租房屋:

public class Host implements Rent {
    public void rent() {
        System.out.println("房东出租房屋");
    }
}
public interface Rent {
    void rent();
}

之前在静态代理的例子中,代理类是编译前写好的,并且对于每一个被代理的角色,都需要手动写一个代理类,非常麻烦。在动态代理中,我们可以根据被代理的角色动态生成需要的代理类:

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

public class ProxyInvocationHandler implements InvocationHandler {
    private Object object;

    public void setObject(Object object) {
        this.object = object;
    }

    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), object.getClass().getInterfaces(),this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(object, args);
        return result;
    }
}

这里采用set方法注入被代理的类,需要实现InvocationHandler接口的方法invoke(),底层用到了反射机制。这段代码对于任何一个被代理的类都可以使用,大大减少了代码量。

有一个打工人前来租房,他需要new一个房东,再new一个代理生成类,然后将房东注入代理生成类并通过getProxy()拿到代理类,然后就可以租房了:

public class Client {
    public static void main(String[] args) {
        Host host = new Host();
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        pih.setObject(host);
        Rent proxy = (Rent) pih.getProxy();
        proxy.rent();
    }
}
分析
  1. 首先与静态代理相比,生成代理类的操作明显变复杂了,但是具备通用性,减少了代码量。
  2. 这里的动态代理是基于接口的JDK原生动态代理,此外还有CGLIB动态代理可以了解一下。
  3. 对于租客来说操作是不是略复杂?Spring的AOP好像可以解决这个问题?
总结

静态代理和动态代理都解决了不改动被代理类的情况下,对被代理类的功能进行扩展的问题。以后有时间可以研究一下动态代理的InvocationHandler接口和Proxy类的原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值