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动态代理的简单例子,但往往简单都是最经典的,基础打好,框架学习才不会那么吃力。
技术可以发展成为一种艺术。

JDK动态代理的实现和原理解析(基于JDK1.7)

一、什么是代理代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。详细介绍请参考:...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017年08月29日 20:18
  • 642

JDK动态代理示例

Java动态代理可以动态地创建代理并动态地处理对所代理方法的调用。下面用《Java编程思想》中的一个例子说明: 首先是接口类,目标类要实现的接口:public interface Interface...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016年04月29日 21:08
  • 916

细说JDK动态代理的实现原理

关于JDK的动态代理,最为人熟知的可能要数Spring AOP的实现,默认情况下,Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现。那么,什...
  • mhmyqn
  • mhmyqn
  • 2015年09月15日 21:12
  • 21930

Java JDK 动态代理

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代...
  • u012410733
  • u012410733
  • 2016年08月14日 18:18
  • 2520

JDK动态代理(接口的代理)

本文基于动态代理的基本思路,实现对接口的动态代理,使用接口函数完成你想完成的任务。其实主要是为了理解在使用mybatis的时候只有dao层接口函数,却可以在service层用来实现其配置文件中sql语...
  • ccityzh
  • ccityzh
  • 2017年04月12日 21:21
  • 499

JDK动态代理(一)

介绍        代理模式         代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理...
  • xiaohai0504
  • xiaohai0504
  • 2011年10月18日 16:15
  • 6801

Java动态代理-JDK自带实现

上篇文章讲解了什么是静态代理,但是静态代理有一个问题就是需要建立很多的代理类,这样我们需要修改代理的方法的时候,需要在每个类中都要修改,这对于我们来说:当代理类很多的时候工作量就会成倍的增加。    ...
  • u013038643
  • u013038643
  • 2016年11月13日 19:35
  • 971

jdk动态代理例子

jdk动态代理例子1. 声明接口package cn.zhengyong.proxy;/** * 接口 * @author zhengyong * */ public interface Or...
  • zhengyong15984285623
  • zhengyong15984285623
  • 2016年06月17日 15:26
  • 762

深入剖析JDK动态代理源码实现

动态代理、静态代理优缺点优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。动态代理只有在用到被代理对象的时候才会对被代理类进行类加载。 而静态代理在编译器就已经开始占内存了...
  • lsgqjh
  • lsgqjh
  • 2017年03月30日 14:18
  • 359

jdk动态代理参数理解

jdk动态代理的理解
  • liaodaer
  • liaodaer
  • 2016年12月03日 11:46
  • 654
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDK的动态代理
举报原因:
原因补充:

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