@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
这几个类实现的,能来搜这种帖子我就已经能相信你可以通过这点信息去搞懂了!!!不懂可以联系我