动态代理
昨天看了马士兵老师的视频教程,对动态代理有了点自己的理解,写下来防止以后忘了,如有不正之处请多指教。
代理即是在进行一些处理之前或之后插入一些其他的附加操作,所以称为AOP面向切面编程。
四种类:
1. 被代理类:
以汽车、坦克等为例,这种类有一个抽象接口,例如Moveable,为了在调用实现的具体方法前插入其他的事物逻辑,比如检查车辆情况、检查驾驶员情况等,需要动态代理。
2. 代理处理类:
这种类就是要被插入的事物逻辑类,比如检查车辆情况、检查驾驶员情况等都在这个类中实现,会通过参数接收被代理类的对象,这样就知道要对什么进行代理,即对汽车还是坦克进行检查车辆情况、检查驾驶员情况等处理。
3. 代理生成类:
这种类是Java提供的,可以看做一个工具,接受的参数有三个,第一个是被代理类的信息,通过getClassLoader方法获得,第二个是被代理类实现的接口,第三个是代理处理类的对象。通过这些参数,JVM动态的生成一个代理类。
4. 代理类:
因为代理生成类的参数都是为了生成这种代理类,所以其实现了被代理类的接口,即它有了能够实现Moveable的具体方法,并且它还获得了代理处理类的对象。这样,在调用具体的move方法内部,它会调用代理处理类对象的invoke方法。这个invoke方法就是处理具体事务逻辑的方法,即在move之前要做些什么操作,之后要做些什么操作,这里的具体操作是检查车辆情况、检查驾驶员情况等。
在主方法中进行如下操作:
- //实例化要代理的对象
- Tank t = new Tank();
- //实现具体的代理处理类对象,将要代理的对象传入
- //InvocationHandler 是一个自定义的代理接口,CheckHandler是其实现子类
- InvocationHandler h = new CheckHandler(t);
- //通过代理生成类动态生成一个代理类,该代理类实现了传入的接口,使用传入的代理处理类对象调用其代理处理方法,返回代理类的对象
- Moveable m = (Moveable) Proxy.newProxyInstance(Moveable.class,h);
- //m是一个代理类的对象,调用的方法实际上是代理类的方法,该方法内部调用invoke方法
- m.move;
用通俗的话说,就是你给我被操作的对象和要插入的处理,我给你生成一个类,别人就用这个类来操作,用的时候这个类的对象会在这些操作前后插入你要求的处理。如果别人不想加入插入的处理了,就用你自己的对象。