Mybatis是如何将User::getAge转化成字段的

    @Test
    public void 模拟MybatisLambdaQueryWrapper(){
        MyLambdaQueryWrapper myLambdaQueryWrapper=new MyLambdaQueryWrapper();
        myLambdaQueryWrapper.gt();
    }

    class MyAbstractWrapper implements MyCompare{

        @Override
        public void gt2() {
            System.out.println("gt2");
            columnToString("");
        }
        
        void columnToString(String getAge在这里传进来){
            if (getAge在这里传进来.startsWith("is")) {
                getAge在这里传进来 = getAge在这里传进来.substring(2);
            } else if (getAge在这里传进来.startsWith("get") || getAge在这里传进来.startsWith("set")) {
                getAge在这里传进来 = getAge在这里传进来.substring(3);
            } else {
                throw new ReflectionException("Error parsing property name '" + getAge在这里传进来 + "'.  Didn't start with 'is', 'get' or 'set'.");
            }

            if (getAge在这里传进来.length() == 1 || (getAge在这里传进来.length() > 1 && !Character.isUpperCase(getAge在这里传进来.charAt(1)))) {
                getAge在这里传进来 = getAge在这里传进来.substring(0, 1).toLowerCase(Locale.ENGLISH) + getAge在这里传进来.substring(1);
            }
        }

    }
    class MyAbstractLambdaWrapper extends MyAbstractWrapper{

    }
    interface MyCompare{
        default void gt(){
            System.out.println("gt");
            gt2();
        }
        void gt2();
    }

    class MyLambdaQueryWrapper extends MyAbstractLambdaWrapper {
    }
package com.yinpeng.test;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import lombok.Data;
import org.junit.Test;

import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;

@Data
public class LambdaTest {

    private String fieldA;

    public static void main(String[] args) throws Exception {
/*        SerializedLambda serializedLambda = doSFunction(new SFunction<LambdaTest, String>() {
            @Override
            public String apply(LambdaTest lambdaTest) {
                return lambdaTest.getFieldA();
            }
        });*/
        SerializedLambda serializedLambda = doSFunction(LambdaTest::getFieldA);
        System.out.println("方法名:" + serializedLambda.getImplMethodName());
        System.out.println("类名:" + serializedLambda.getImplClass());
        System.out.println("serializedLambda:" + JSONUtil.toJsonStr(serializedLambda));
    }

    private static <T, R> java.lang.invoke.SerializedLambda doSFunction(SFunction<T, R> func) throws Exception {
        // 直接调用writeReplace
        Method writeReplace = func.getClass().getDeclaredMethod("writeReplace");
        writeReplace.setAccessible(true);
      	//反射调用
        Object sl = writeReplace.invoke(func);
        java.lang.invoke.SerializedLambda serializedLambda = (java.lang.invoke.SerializedLambda) sl;
        return serializedLambda;
    }


    @Test
    public void test01(){
        test(String::toString);
    }

    public void test(inter inter){

    }
    interface inter{
        String creatInter(String s);
    }

}

下面的代码是讲解如何将lambda转化成字符串的,上面的是具体的调用关系

lambdaQuery主要是通过

LambdaQueryWrapper、AbstractLambdaWrapper、LambdaUtils、PropertyNamer、Compare、AbstractWrapper

这几个类实现的,能来搜这种帖子我就已经能相信你可以通过这点信息去搞懂了!!!不懂可以联系我

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值