JDK的动态代理

原创 2015年07月09日 15:51:27
动态代理应用非常广泛,本节只叙述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动态代理的简单例子,但往往简单都是最经典的,基础打好,框架学习才不会那么吃力。
技术可以发展成为一种艺术。

相关文章推荐

Java动态代理(JDK和cglib)

  • 2017年07月04日 21:10
  • 246KB
  • 下载

jdk动态代理技术详解

  • 2013年06月30日 13:59
  • 101KB
  • 下载

Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)

关于动态代理模式里面有两种实现,一种是jdk实现,一种是cglib来实现。 下面来整jdk来实现动态代理的Java实例。 jdk动态代理模式里面有个拦截器的概念,在jdk中,只要实现了Invocati...

jdk动态代理

  • 2014年06月13日 11:40
  • 8KB
  • 下载

java jdk 动态代理演示demo

  • 2016年08月07日 17:14
  • 18KB
  • 下载

动态代理双剑客--JDK Proxy与CGLIB

主要对比JDK Proxy和CGLIB两种动态代理实现方案,一个是接口实现,一个是继承父类,各有千秋...

JDK动态代理源码

  • 2016年11月30日 14:10
  • 2KB
  • 下载

Java动态代理详解,以及底层JDK源码实现分析(基于Java8)。

Java动态代理详解,以及底层JDK源码实现分析(基于Java8)。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDK的动态代理
举报原因:
原因补充:

(最多只允许输入30个字)