zoukankan      html  css  js  c++  java
  • 思想无语言边界:以 cglib 介绍 AOP 在 java 的一个实现方式

    0. 前言

    上接:基于 Source Generators 做个 AOP 静态编织小实验

    作为第三篇,我们基于cglib在java做一个简单的aop例子, 以此简单作为例子说一个思路在什么样的语言里面都是共同的,这是骨,不要纠结什么语言什么实现,这只是皮。

    同以前一样,是个人随笔,不是新手教学,不会教会别人怎么使用cglib,只会给出官方文档,请自学成才。

    内容安排如下:

    • cglib demo
    • 简单介绍cglib原理

    1. cglib demo

    1.0 cglib 是什么?

    https://github.com/cglib/cglib/wiki 官方介绍地址

    cglib 全名 Code Generation Library, 是个动态代理代码生成库,用来在运行时 extend JAVA classes and implements interfaces。

    1.1 demo

    1.1.1 使用 cglib 创建代理类

        public static Object createProxy(Class clazz, MethodInterceptor interceptor) {
            try {
                Enhancer e = new Enhancer();
                e.setSuperclass(clazz);
                e.setCallback(interceptor);
                Object bean = e.create();
                return bean;
            } catch (Throwable e) {
                e.printStackTrace();
                throw new Error(e.getMessage());
            }
        }
    

    1.1.2 实现AddOneInterceptor

    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    import java.lang.reflect.Method;
    public class AddOneInterceptor implements MethodInterceptor {
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            if(method.getReturnType() == int.class) {
                return ((Integer) methodProxy.invokeSuper(o, objects)) + 1;
            } else {
                return methodProxy.invokeSuper(o, objects);
            }
        }
    }
    

    1.1.3 测试

    public class RealClass {
        public int Add(int i, int j)
        {
            return i + j;
        }
    }
    public static void main(String args[]) {
        RealClass proxy = (RealClass) createProxy(RealClass.class, new AddOneInterceptor());
        int i = 5;
        int j = 10;
        System.out.println(String.format("%s + %s = %s, but proxy is %s", i, j, i + j, proxy.Add(i, j)));
    }
    

    结果:

    5 + 10 = 15, but proxy is 16
    

    2. 简单介绍cglib原理

    原理一句话:动态生成一个类的子类作为代理类,在子类中扩展想要加入的功能。

    底层基于ASM 一个字节码处理框架。

    ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。

    可以看 https://developer.ibm.com/zh/articles/j-lo-asm30/ 这篇文章完整了解ASM。

    可以说 cglib 就是ASM在动态代理类的一个完整封装框架。

  • 相关阅读:
    蠢货之对闭包表的扩展
    蠢货之TaskCompletionSource 带事件的同步调用
    SQLSERVER新建存储过程模板
    缓存更新
    写给”源码爱好者“
    区块链-一个不神秘却总能骗人的东西
    graceful-upgrades-in-go
    谁也逃不过C++
    Go的问题
    面试
  • 原文地址:https://www.cnblogs.com/fs7744/p/14137936.html
Copyright © 2011-2022 走看看