代理 一、概念:为已存在的多个具有相同接口的目标类的各个方法添加一些系统功能,如异常处理、日志、事务管理等。 优点:采用工厂模式和配置文件的方式进行管理不需要修改客户端程序,在配置文件中配置是使用目标类还是代理类,很容易切换,方便增删系统功能。 二、动态代理技术: 引入原因:要为系统中的各个接口的类增加代理功能,将需要太多的代理类,全部使用静态代理方式将非常麻烦的。 实现方式: 1、JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。(JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能用作具有相同接口的目标类的代理) 2、CGLIB库可以动态生成一个类的子类,一个类的子类也可以用作该类的代理,所以,如果要为一个没有实现接口的类生成动态代理类,就可以使用CGLIB库。 注:代理类的各个方法中通常处理要调用目标的相应方法和对外返回目标返回的结果外,还可以再代理方法的如下四个位置加上系统功能代码: 1)在调用目标方法之前 2)在调用目标方法之后 3)在调用目标方法前后 4)在处理目标方法异常的catch块中 三、分析JVM动态生成的类 三种方法: 1、(1)Proxy.getProxyClass(interface加载器) (2)获得含参数的构造方法.getConstructor(InvocationHandler,class) (3)创建MyInvocationHandler类实现InvocationHandler接口,并覆写invoke()方法; 2、使用匿名内部类:new InvocationHandler{ 覆写invoke(); } 3、.newProxyInstance方法,直接将类与对象直接创建 Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){ 覆写invoke(); })
|