美文网首页
Java动态代理之cglib

Java动态代理之cglib

作者: 赵志文学编程 | 来源:发表于2017-07-24 11:32 被阅读0次

cglib和jdk自带的动态代理

记得上次的动态代理,感觉讲的不是很好,因为我漏了好几个重要的点。而且关于cglib这个基于asm框架的代理也没讲到。求知切记不要一知半解。

从上次的动态代理展开,为什么我们原本jdk自带了动态代理,偏偏又出来个cglib这个额外第三方库呢?人家总不可能是傻子吧,造了的轮子再造一遍。说明自带的动态代理有不足点:
委托类必须实现接口(拿上次的例子来说就是学生是委托类,DynamicProxy是代理类)

现实的开发中不可能所有的类都实现接口吧(好吧虽然这是一个面向接口、面向配置文件编程语言),所以出现了cglib这个与众不同的轮子,它不是基于反射机制,它是基于asm这个直接能够修改字节码的框架。我们只要知道一点那就是基于jdk的动态代理他的代理类实际上是实现与它相同的接口,这就意味着你不实现接口jdk的动态代理是无法为您提供服务的

cglib

填完上次的坑,我们来简单看下cglib。我们直接上例子吧
我们如上次那样先定义一个不实现Person接口的类Teacher

public class Teacher{
    public void eat() {
        System.out.println("teacher is eating dinner");
    }
    public void drink() {
        System.out.println("teacher is drinking juice");
    }
    public void sleep() {
        System.out.println("teacher is sleeping");
    }
    public void WC() {
        System.out.println("teacher is WCing");
    }
}

再是一个方法拦截器类

import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class TeacherInterceptor implements MethodInterceptor {
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("----starting!----");
        Object object = proxy.invokeSuper(obj, args);//调用委托类的原方法
        System.out.println("----ending!----");
        return object;
    }
}

最后的最后是测试类

import net.sf.cglib.proxy.Enhancer;
public class TestCglib {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Teacher.class);
        enhancer.setCallback(new TeacherInterceptor());
        Teacher t = (Teacher)enhancer.create();
        t.drink();
    }
}

具体背后怎么实现其实是一种基于索引的方式调用委托类的具体看狼哥的分析

相关文章

  • 源码基础 -- 动态代理(2)

    再看java动态代理之Cglib动态代理,早期大家选择Cglib主要是因为Cglib底层采用ASM字节码生成框架,...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • 设计模式之代理

    设计模式之代理模式 一、定义 在Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及CGLIB动态...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • Jdk动态代理 底层源码分析

    前言 java动态代理主要有2种,Jdk动态代理、Cglib动态代理,本文主要讲解Jdk动态代理的使用、运行机制、...

  • 浅析设计模式-代理模式

    定义 简单设计 Java 的实现3.1. 静态代理3.2. JDK 动态代理3.3. CGLIB 动态代理 应用实...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

网友评论

      本文标题:Java动态代理之cglib

      本文链接:https://www.haomeiwen.com/subject/qrxbkxtx.html