文档章节

java的动态代理,cglib动态代理

 会编程的羊
发布于 2017/08/22 20:15
字数 492
阅读 31
收藏 1

java的动态代理中,jdk动态代理是基于接口的,也就是说,如果一个类想要通过代理被调用,那这个类一定要有实现的接口。而cglib动态代理是基于继承的,这个并不是说想要通过代理被调用的类必须要有一个父类,而是说,恰恰相反,此类不需要实现任何接口或继承任何类。这里说的基于继承,指的是:cglib会自动生成一个此类的子类,并重写此类的所有方法,从而达到代理的目的。所以一个类要想被cglib动态代理,那么这个类一定不能是final的,方法也不能是final的。下面看例子

首先我们需要一个目标类,一个很普通的类,没有接口,也没有继承

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class SuperStar {
    public void getMsg(String name){
        System.out.println("我叫" + name + ",我是一个明星");
    }
}

然后,我们需要一个callback,这个类需要实现MethodInterceptor,而它又继承了callback接口

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class Proxy implements MethodInterceptor {
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) 
            throws Throwable {
        System.out.println("方法名称是:" + method.getName());
        System.out.print("参数是:");
        for(int i =0 ;i<objects.length;i++){
            System.out.print(objects[i]);
        }
        System.out.println();
        System.out.println("-----------------before-------------------");
        //注意这里使用的是invokeSuper()方法,而不是invoke()方法,很重要!不然会死循环
        Object result =  methodProxy.invokeSuper(o,objects);
        System.out.println("-----------------after--------------------");
        System.out.println("返回值是:" + result);
        return result;
    }
}

下面是测试类

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;

/**
 * Created by lidongyang on 2017/8/22 0022.
 */
public class Test {
    public static void main(String[] args) {
        //通过Enhancer获取代理类
        Callback proxy = new Proxy();
        Enhancer enhancer = new Enhancer();
        //设置要代理的目标类
        enhancer.setSuperclass(SuperStar.class);
        //设置callback
        enhancer.setCallback(proxy);
        //获取代理类
        SuperStar superStar = (SuperStar)enhancer.create();
        //通过代理类来执行方法
        superStar.getMsg("林志玲");
    }
}

输出

 

读到这里,又是一个Spring AOP的简单实现。

jdk动态代理实现地址: https://my.oschina.net/u/3410701/blog/1518849

© 著作权归作者所有

粉丝 4
博文 59
码字总数 19944
作品 0
朝阳
程序员
私信 提问
cglib代理和java自带代理的区别

一 动态代理主要有java自带的代理和cglib方式实现的代理 首先讲下java自带的代理 ------------------然后是cglib自带的代理------------------------- 测试类: java动态代理是利用反射机制生...

sen_ye
2018/07/15
62
0
Spring Boot AOP代理

AOP 代理的两种实现: jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到; cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。 Java 动态代理。 具体有如下四...

xiaolyuh
09/21
33
0
java动态代理和cglib动态代理

动态代理应用广泛,Spring,Struts等框架很多功能是通过动态代理,或者进一步封装来实现的。 常见的动态代理模式实现有Java API提供的动态代理和第三方开源类库CGLIB动态代理。 Java API提供...

Carl_
2014/12/30
277
0
JDK动态代理与Cglib动态代理(转载)

spring容器通过动态代理再结合java反射思想可以使得方法调用更加简洁 一、动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式【Proxy Pattern】(...

思悟修
2015/08/14
627
0
深入理解Cglib动态代理及手动实现

CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代...

HOT_POT
2018/07/28
107
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部