动态代理

原创 2018年04月17日 14:38:03

一、动态代理是通过一个代理对象来调用真实服务对象。动态代理分为两种,一种是JDK反射机制提供的代理,另一种是CGLIB代理。JDK代理需要接口,CGLIB代理不需要接口

二、JDK动态代理

       通过Java的反射机制,获取目标对象,反射调用函数。由java.lang.reflect.*提供支持,主要有一下几个步骤:

      ①:创建接口以及实现类

public interface IReflectService {
    public void sayHello();
}

public class ReflectService implements IReflectService {
    public void sayHello() {
        System.out.println("hello world");
    }
}

     ②:编写一个代理类,提供真实对象的绑定和代理方法,代理类需要实现InvocationHandler接口中的代理方法,当一个对象被绑定后,执行其方法就会进入到代理方法中

public class ReflectProxy implements InvocationHandler {

    private Object target;

    //绑定对象并返回一个代理类
    public Object bind(Object target){
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法执行前");
        Object result = null;
        result = method.invoke(target,args);
        System.out.println("方法执行后");
        return result;
    }
}

     ③:测试

public class Test {
    public static void main(String[] args){
        ReflectProxy proxy = new ReflectProxy();
        IReflectService reflectService = (IReflectService) proxy.bind(new ReflectProxy());
        reflectService.sayHello();
    }
}

在mybatis中使用Mapper接口就是使用的JDK动态代理方式实现的,并且在方法调用前后可以加入自己想要的东西

三、CGLIB动态代理

为了弥补JDK动态代理必须提供接口的缺陷,我们可以使用开源框架---CGLIB动态代理类

   ①:前面的ReflectService以及IReflectService都不需要改变

   ②:实现CGLIB的代理类

public class ReflectProxy implements MethodInterceptor {

    private Object target;

    public Object bind(Object target){
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass().getSuperclass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("方法执行前");
        Object result = null;
        result = methodProxy.invokeSuper(target,objects);
        System.out.println("方法执行后");
        return result;
    }
}
在Mybatis中延迟加载时使用了CGLIB动态代理



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35271549/article/details/79973620

《C语言/C++学习指南》动态库和静态库

-
  • 1970年01月01日 08:00

java动态代理(重要).

  • 2011年06月24日 22:54
  • 5KB
  • 下载

动态代理——从一窍不通到恍然大悟

从具体的例子出发,由浅入繁介绍代理这种设计模式和具体可以处理的问题
  • u011026779
  • u011026779
  • 2017-04-02 22:50:02
  • 1830

动态代理的几种方式

AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执...
  • Happy_wu
  • Happy_wu
  • 2017-12-19 14:34:33
  • 7255

动态代理(2)----动态代理和AOP

根据前面介绍的Proxy和InvocationHandler,实在很难看出这种动态代理的优势,下面介绍一种更实用的动态代理机制.只要我们开发一个实际使用的软件系统,总会出现相同代码重复出现的情形,在这...
  • beijiguangyong
  • beijiguangyong
  • 2013-02-28 22:09:27
  • 4347

Java反射机制详细示例及动态代理

反射可以在程序运行过程中动态获取类的相关信息,包括类由哪个类加载器进行加载,类中的成员变量,成员方法,访问修饰符,返回值类型,构造方法等等; 首先要获取类的Class对象.获取Class对象有三种方法...
  • qgfjeahn
  • qgfjeahn
  • 2016-09-30 10:14:22
  • 3120

黑马程序员--装饰设计模式和动态代理

装饰设计模式: 装饰设计模式解决:对一组类进行功能的增强。 包装:写一个类(包装类)对被包装对象进行包装;  * 1、包装类和被包装对象要实现同样的接口;  * 2、包装类要持有一个被包装对象;  *...
  • u014481780
  • u014481780
  • 2015-05-10 19:18:34
  • 634

jdk动态代理示例以及代码原理分析

相信很多人在刚刚学习Java时,会感觉【动态代理】晦涩难懂,只知道如何来调用它,却不知道它的实现细节。本文通过根据JDK源码,展示这些细节,以期能对JDK的动态代理有深入的理解。 简单示例代码 pub...
  • PKWind
  • PKWind
  • 2016-12-09 14:49:21
  • 1079

动态代理应用场景 Java

package com.lcj.dongtaidaili;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Me...
  • AniuLincion
  • AniuLincion
  • 2015-08-18 17:47:11
  • 936

动态代理的通俗理解

动态代理 四种类: 1.        被代理类: 以汽车、坦克等为例,这种类有一个抽象接口,例如Moveable,为了在调用实现的具体方法前插入其他的事物逻辑,比如检查车辆情况、检查驾驶员情况...
  • daskyrk
  • daskyrk
  • 2014-08-30 10:25:01
  • 715
收藏助手
不良信息举报
您举报文章:动态代理
举报原因:
原因补充:

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