初步探究cglib动态代理的原理

硅谷探秘者 1929 0 0

初步探究cglib动态代理的原理

之前我们说了一下jdk动态代理的原理 http://www.jiajiajia.club/weblog/blog/artical/60

本章说一下cglib动态代理,做个笔记

1.按照国际惯例,先来个HelloWorld

package cglib;

import java.lang.reflect.Method;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * *受理类
 * @author Administrator
 *
 */
class Target{
    public void f(){
        System.out.println("Target f()");
    }
    public void g(){
        System.out.println("Target g()");
    }
}
/**
 * *方法拦截器
 * @author Administrator
 *
 */
class Interceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
        System.out.println("before");//目标方法执行前
        proxy.invokeSuper(obj, args);//调用目标类的方法
        System.out.println("after");//目标方法执行后
        return null;
    }
}

/**
 * 测试
 * @author Administrator
 */
public class MainTest {
  public static void main(String[] args) {
     System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\\test\\cglib");
       Enhancer eh = new Enhancer();//实例化一个增强器,也就是cglib中的一个class generator
       eh.setSuperclass(Target.class);//设置目标类
       eh.setCallback(new Interceptor());// 设置拦截对象
       Target t = (Target) eh.create();// 生成代理类并返回一个实例
       t.f();
       t.g();
       System.out.println("t对象的父类:"+t.getClass().getSuperclass().getName());
  }
}

1551884935025095339.png


后续完善···

猜你喜欢
java基础 1385 jdk1.先看码实现packageclub.jiajiajia.test.staticproxy;publicinterfaceBuyHouse{voidbuyHosue
ASM,java基础 384   关于cglib概念和以及常用api,请参考:cglib:http://www.jiajiajia.club/blog/artical/yjw520
weblog 2822 前言 好久就开始关注cglib了,但是到今天才算是有点搞明白~cglib底层用到了asm等字节码操作框架。不懂可以先百度百度asm是干啥,在这里也提供一些文章,但是可能比较深入
ASM,java基础 351 概念和,这里就不多说了,详细请参考以往博客:cglib:http://www.jiajiajia.club/blog/artical/yjw520/134cglib
java基础 1661 java静示例packageclub.jiajiajia.test.staticproxy;publicinterfaceBuyHouse{voidbuyHosue();//买房子
ASM,java基础 312 cglib指定只某个方法importnet.sf.cglib.proxy.*;importjava.lang.reflect.Method;classSampleClass
linux系统 4710 方案一:一般配置方案二:访问某个域名时资源文件方案一:一般配置  如果以html、htm、gif、jpg、jpeg、bmp、png、ico、txt、js、css结尾资源,均由nginx处
其他 2617 1.编译技术从JDK1.6开始引入了用Java码重写编译器接口,使得我们可以在运行时编译Java源码,然后用类加载器进行加载,让Java语言更具灵活性,能够完成许多高级操作。2.本次要实现
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础
目录
余生别太较劲,放过自己 才会幸福。