cglib代理接口及mybatis接口的实现原理

硅谷探秘者 ASM,java基础 941 0 0

  关于cglib代理的概念和原理以及常用api,请参考:

  InvocationHandler可以实现对接口的代理,类似与mybatis,代码中开发者只需要写一个接口和一个xml,mybatis会根据xml的描述信息,帮你生成对应的方法实现,参数的解析、sql的生成、发送、结果集的封装等都不用开发者去写。而其中的原理就是利用了代理模式。cglib对此有很好的实现方案。
  首先定义一个接口,这个接口里有各种返回值类型的方法。

import java.util.List;
public interface TestInterface {
    String testString(Integer id);
    int testInt(String value);
    List testList(Integer age,Integer g);
    SampleClass testSampleClass();
}

  用代理模式去实现这些方法。实现类交由cglib去动态创建。

import net.sf.cglib.proxy.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class test2 {
    public static void main(String[] args)  {
        Class[] classes = {TestInterface.class};
        Enhancer enhancer = new Enhancer();
        enhancer.setInterfaces(classes);
        CallbackHelper callbackHelper = new CallbackHelper(Object.class, classes) {
            @Override
            protected Object getCallback(Method method) {
                // 只代理TestInterface中的方法
                if(method.getDeclaringClass() == TestInterface.class){
                    return new InvocationHandler() {
                        @Override
                        public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                            System.out.print("参数:");
                            for (Object object : objects) {
                                System.out.print(object+"\t");
                            }
                            System.out.println();
                            Class<?> returnType = method.getReturnType();
                            if (returnType == int.class || returnType == Integer.class) {
                                // 返回值类型是整数类型
                                return 1;
                            }else if(returnType == String.class){
                                // 返回值类型是字符串
                                return "string";
                            }else if(returnType == List.class){
                                // 返回值类型是集合
                                ArrayList arrayList = new ArrayList();
                                arrayList.add("11");
                                return arrayList;
                            }
                            // ... 等等
                            else{
                                // 自定义类型
                                return returnType.newInstance();
                            }
                        }
                    };
                }else{
                    // 什么都不做
                    return NoOp.INSTANCE;
                }
            }
        };
        enhancer.setCallbackFilter(callbackHelper);
        enhancer.setCallbacks(callbackHelper.getCallbacks());
        TestInterface proxy = (TestInterface) enhancer.create();
        System.out.println("返回值:"+proxy.testInt("123"));;
        System.out.println("返回值:"+proxy.testList(1,1));;
        System.out.println("返回值:"+proxy.testString(1));;
        System.out.println("返回值:"+proxy.testSampleClass());;
    }
}
猜你喜欢
ASM,java基础 834 、InvocationHandler  InvocationHandler可以,类似与mybatis码中开发者只需要写一个和一个xml,mybatis会根据xml描述信息,帮你生成对应方法,参数解析
java基础 2914 初步探究cglib动态之前我们说了一下jdk动态http://www.jiajiajia.club/weblog/blog/artical/60本章说一下cglib动态,做个
算法基础 1803 如果一个类了一个,如何获取中泛型际类型importjava.lang.reflect.ParameterizedType; importjava.lang.reflect.Type
weblog 4012 前言 好久就开始关注cglib动态了,但是到今天才算是有点搞明白~cglib动态底层用到了asm等字节码操作框架。不懂可以先百度百度asm是干啥,在这里也提供一些文章,但是可能比较深入
official 2273 ,我们就可以定义一个或者多个BeanPostProcessor,然后注册到容器中。  声明如下:publicinterfaceBeanPostProcessor{@Nullabledef
nginx 2019 超过60秒(默认)没有活动字,并将其断开连。 解决方法 一、修改nginx超时时间 时间根据际需求配置,单位秒 proxy_read_timeout86400s; proxy_send_
java基础 1227 参数 抽象类 默认方法 它可以有默认方法 完全是抽象。它根本不存在方法 子类使用extends关键字来继承
框架 1602 springboot获取项目中所有对外提供信息@ComponentpublicclassTestimplementsApplicationRunner
归档
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 2022年10月  2 2022年12月  5 2023年01月  3 2023年02月  1 2023年03月  4 2023年04月  2 2023年06月  3 2023年07月  4 2023年08月  1 2023年10月  1 2024年02月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。