关闭

JDK的动态代理

标签: 动态代理
105人阅读 评论(0) 收藏 举报
分类:
动态代理应用非常广泛,本节只叙述JDK的动态代理的使用。关于JDK动态代理的源码分析以及在Spring上的运用,将随后介绍。

一、动态代理的作用:有这样一种需求:我们现在有一个类,类里面有一个方法,要求我们在不改变这个类的源代码的情况下,为这个方法前后增加一些处理(比如:日志处理,事务处理,权限处理等),我们该如何办呢?这个时候,我们就需要为这个类生成一个代理类(静态代理和动态代理),由这个代理类为原类服务。
二、 问题准备:
        
        接口:机动车类Vehicle.java
                   
public interface Vehicle {
                public void run(int speed);
                    }
       实现接口的类:公交车类Bus.java
                    public class Bus implements Vehicle {

                    @Override
                    public void run(int speed) {
                    System.out.println("公共汽车正在跑,速度为:" + speed + "km/h");
                    }
                    }             
         我们需要做的是在Bus类中的run方法内部的前后增加处理。
三、静态代理:
        代理类:VehicleProxy.java
         
public class VehicleProxy implements Vehicle {

        private Vehicle vehicle;
        public VehicleProxy(Vehicle vehicle) {
    super();
    this.vehicle = vehicle;
        }

        @Override
        public void run(int speed) {
    System.out.println("启动时加速。。。");
    vehicle.run(speed);
    System.out.println("停止时减速。。。");
        }
        }    

        测试类:
        
public class TestProxy {
    public static void main(String[] args) {
Vehicle vehicle = new Bus();
VehicleProxy vehicleProxy = new VehicleProxy(vehicle);
vehicleProxy.run(100);
            } 
        } 
        结果:
        启动时加速。。。
        公共汽车正在跑,速度为:100km/h
        停止时减速。。。 
四、静态代理弊端:
       扩展性不好,我们每代理一个类,就要写一个代理类,类会越来越多。

五、动态代理:
       JDK的动态代理会使用jdk中的两个重要的类:Proxy类和InvocationHandler类。
        
       代理类:VehicleInvacationHandler.java 需要实现
InvocationHandler接口
        import java.lang.reflect.InvocationHandler;
        import java.lang.reflect.Method;
        import java.lang.reflect.Proxy;

        public class VehicleInvacationHandler implements InvocationHandler {
    // 被代理类的实例对象
    Object any_Object;
    public VehicleInvacationHandler(Object any_Object) {
    super();
    this.any_Object = any_Object;
    }
    @Override
    public Object invoke(Object arg0, Method arg1, Object[] arg2)
    throws Throwable {
    System.out.println("启动时加速。。。");
    Object vehiclMehtod = arg1.invoke(any_Object, arg2);
    System.out.println("停止时减速。。。");
    return vehiclMehtod;
    }
    // 返回代理类的实例
    public Object getProxyClassInstance(){
    Object proxyObject = 
Proxy.newProxyInstance(any_Object.getClass().getClassLoader(), any_Object.getClass().getInterfaces(), this);
    return proxyObject;
    }
    }

    在该代理类中我们没有发现任何与所给题目有关的信息(Vehicle接口)。

    测试类:TestProxy.java
    
public class TestProxy {
public static void main(String[] args) {
Vehicle vehicle = new Bus();
VehicleInvacationHandler vehicleInvocationHandler = new VehicleInvacationHandler(vehicle);
Vehicle vehicleProxy = (Vehicle)vehicleInvocationHandler.getProxyClassInstance();
vehicleProxy.run(100);
}
    }

    结果:
     
启动时加速。。。
     公共汽车正在跑,速度为:100km/h
     停止时减速。。。
六、总结
      这是一个使用JDK动态代理的简单例子,但往往简单都是最经典的,基础打好,框架学习才不会那么吃力。
技术可以发展成为一种艺术。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1887次
    • 积分:61
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档