cglib动态代理(Java之JDK和CGlib实现动态代理)

 2025-08-10 07:51:01  阅读 813  评论 0

摘要:在Java中,对于动态代理,在框架中用到很多,我们可以通过JDK提供的InvocationHandler类实现动态代理,这个方法的缺点是,必须要有接口和实现类,然而Cglib这个工具类,解决了这个问题,可以直接通过类来进行动态代理的操作。Cglib是基于asm的,反射类的生成比较慢,但是方法

在Java中,对于动态代理,在框架中用到很多,我们可以通过JDK提供的InvocationHandler类实现动态代理,这个方法的缺点是,必须要有接口和实现类,然而Cglib这个工具类,解决了这个问题,可以直接通过类来进行动态代理的操作。Cglib是基于asm的,反射类的生成比较慢,但是方法执行速度快,javaassist可以用来修改字节码,也可以实现aop的操作

  jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。

  ASM 是一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。  不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。

通过javaのJDK来实现

通过继承Java的InvocationHandler类,这种方法需要有接口类,才可以实现

Java之JDK和CGlib实现动态代理

接口类

interface BookServie{
    /**
     * 添加图书的操作
     * @return
     */
    String add(String name);
}1234567

实现类

class BookServieImpl implements BookServie{

    @Override
    public String add(String name) {
        System.out.println("Book Add Method");
        return "添加书籍"+name;
    }
}

代理类

需要复习 invoke 的方法,可以在这个地方来做一些方法调用的前后处理事情,同时还需要写一个getProxy方法来绑定我们的BookProxy 和BookServie 这两个类.

/**
 * 使用java本生的代理对象需要用到,接口类,实现类
 * @author yellowcong
 * @data 2017/08/31
 */
class BookProxy implements InvocationHandler{
    private Object target ;

    public BookProxy(Object target) {
        super();
        this.target = target;
    }
    /**
     * 将Object绑定到当前的对象上
     * @param target
     * @return
     */
    public Object getProxy() {

        //初始化代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        try {
            System.out.println("proxy before");
            result =  method.invoke(this.target, args);
            System.out.println("proxy end");
        }finally {

        }
        return result;
    }

}

测试

/**
*
*作者:yellowcong
*日期:2017/08/30
*時間:17:08:21
*描述:
*/
public class Demo4 {
    public static void main(String[] args) throws Exception {

        BookProxy proxy = new BookProxy(new BookServieImpl());

        BookServie book = (BookServie) proxy.getProxy();

        String result = book.add("Think in Java");

        System.out.println(result);
    }


}

Java之JDK和CGlib实现动态代理

Cglib实现代理

对于上面说到JDK仅支持对实现接口的委托类进行代理的缺陷,这个问题CGLIB给予了很好的补位,解决了这个问题,使其委托类也可是非接口实现类。需要导入的依赖


    cglib
    cglib
    2.2

net.sf.cglib.proxy.Enhancer – 主要的增强类net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:

实体类

class BookServieDemo{

    public String add(String name) {
        System.out.println("Book Add Method");
        return "添加书籍"+name;
    }
}

代理类

class BookDemoProxy implements MethodInterceptor{
    private Object target ;

    /**
     * 代理对象实例化的时候,就绑定代理
     * @param target
     */
    public BookDemoProxy(Object target  ) {
        this.target = target ;
    }

    /**
     * 获取代理对象
     * @return
     */
    public Object getProxy() {
        return Enhancer.create(this.target.getClass(), this);
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object ret = null;

        System.out.println("proxy before");
        ret = method.invoke(this.target, args);
        System.out.println("proxy end");

        return ret;
    }

}

测试类

/**
*
*作者:yellowcong
*日期:2017/08/31
*時間:9:57:55
*描述:
*/
public class Demo5 {

    public static void main(String[] args) {

        BookDemoProxy proxy = new BookDemoProxy(new BookServieDemo());

        BookServieDemo service = (BookServieDemo) proxy.getProxy();

        String str = service.add("Think in AOP");
        System.out.println(str);
    }
}

Java之JDK和CGlib实现动态代理

版权声明:我们致力于保护作者版权,注重分享,被刊用文章【cglib动态代理(Java之JDK和CGlib实现动态代理)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;

原文链接:https://www.yxiso.com/zhishi/2049698.html

发表评论:

关于我们
院校搜的目标不仅是为用户提供数据和信息,更是成为每一位学子梦想实现的桥梁。我们相信,通过准确的信息与专业的指导,每一位学子都能找到属于自己的教育之路,迈向成功的未来。助力每一个梦想,实现更美好的未来!
联系方式
电话:
地址:广东省中山市
Email:beimuxi@protonmail.com

Copyright © 2022 院校搜 Inc. 保留所有权利。 Powered by BEIMUCMS 3.0.3

页面耗时0.0351秒, 内存占用1.93 MB, 访问数据库24次

陕ICP备14005772号-15