通过序列化,然后反序列化来解析lambda信息
package cn.java.demo.mybatis_plus.internal;
import cn.java.demo.mybatis_plus.mapper.entity.OrderEntity;
import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.property.PropertyNamer;
import java.util.Map;
/**
*/
@Slf4j
public class LambdaResolveDemo {
public static void main(String[] args) {
SFunction<OrderEntity, ?> function = OrderEntity::getUserId;
SerializedLambda serializedLambda = LambdaUtils.resolve(function); // 通过序列化,然后反序列化来解析lambda信息
getColumn(serializedLambda, true);
}
/**
* @param lambda
* @param onlyColumn
* @return
* @see com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper# getColumn(com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda, boolean)
*/
static String getColumn(SerializedLambda lambda, boolean onlyColumn) {
Class<?> aClass = lambda.getInstantiatedType();
String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName());
log.info("fieldName = {}", fieldName);
log.info("lambda.getInstantiatedType() = {}", lambda.getInstantiatedType());
log.info("lambda.getImplMethodName() = {}", lambda.getImplMethodName());
log.info("lambda.getFunctionalInterfaceClassName() = {}", lambda.getFunctionalInterfaceClassName());
log.info("lambda.getImplClass() = {}", lambda.getImplClass());
log.info("lambda.getImplClassName() = {}", lambda.getImplClassName());
if (false) {
Map<String, ColumnCache> columnMap = LambdaUtils.getColumnMap(aClass); // 根据java类名读取db表信息
ColumnCache columnCache = columnMap.get(LambdaUtils.formatKey(fieldName)); // 读取db列信息
return onlyColumn ? columnCache.getColumn() : columnCache.getColumnSelect(); // 读取db列名
}
return "";
}
}
输出
fieldName = userId
lambda.getInstantiatedType() = class cn.java.demo.mybatis_plus.mapper.entity.OrderEntity
lambda.getImplMethodName() = getUserId
lambda.getFunctionalInterfaceClassName() = com.baomidou.mybatisplus.core.toolkit.support.SFunction
lambda.getImplClass() = class cn.java.demo.mybatis_plus.mapper.entity.AbstractOrderEntity
lambda.getImplClassName() = cn.java.demo.mybatis_plus.mapper.entity.AbstractOrderEntity