动态代理模式还是第一次听说,之前虽然学习了代理模式,但是并没有使用过。那么自然就不知道这个模式会有什么优缺点,我们只是看到书上说怎样怎样。那么今天使用到代理模式时就发现,如果我们只是按照书上的标准去照搬代理模式,会有很多的冗余,也不符合面向对象的思想了。
当我们需要给某个类的方法添加同一个功能的时候,如果我们只是简单的使用代理,就会重复的更改所有的方法。而如果我们的业务突然又不需要了,就又是一系列的修改。可见,简单的代理已经不能满足我们的需要了。于是,便用到了动态代理模式。
使用动态代理模式,我们用到InvocationHandler接口的invoke方法和Proxy类。
其中Proxy类主要用来获取动态代理对象。
proxy类的newProxyInstance方法返回代理类的一个实例,返回后的代理类可以当作被代理类使用。
它有三个参数:
ClassLoaderloader ----指定被代理对象的类加载器
Class[]Interfaces ----指定被代理对象所有的接口
InvocationHandler ----指定需要调用的InvocationHandler对象
InvocationHandler对象中加入了代理类代理的接口类(第二个参数指定)的实现类,表现在invoke方法中。所以,调用要实现的接口的方法,都会调用InvocationHandler对象的invoke()方法。而invoke()方法就是Proxy这个动态代理类所代理的接口类的抽象方法的真实实现。
这样就相当于调用了我们需要调用的方法,同时我们可以对调用做控制。
一句话总结动态代理:
newProxyInstance方法的三个参数指定被代理对象的类加载器、接口和对接口的实现,返回被代理的的类实例,调用该实例的方法时其实就是调用包含了该方法的实现的invoke方法。