使用LambdaUtils动态获取Lambda表达式相关信息

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

可以使用com.baomidou.mybatisplus.core.toolkit包下面的LambdaUtils类去解析lambda表达式,能够获取到对应的类信息以及字段信息


一、LambdaUtils是什么?

LambdaUtils是Lambda表达式的工具类,可以动态获取Lambda表达式的相关类信息等,可以使代码更优雅

二、使用步骤

package com.charles.jee.fk.demo.domain;

import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
import com.charles.jee.fk.boot.config.core.exceptions.JeeFkRuntimeException;
import com.charles.jee.fk.domain.AppLication;
import com.charles.jee.fk.modules.oms.entity.Project;
import org.apache.ibatis.reflection.property.PropertyNamer;
import org.junit.After;
import org.junit.Before;
import org.springframework.boot.test.context.SpringBootTest;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Optional;


//@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppLication.class)
public class ApplicationTest {

    @Before
    public void init() {
        System.out.println("开始测试-----------------");
    }

    @After
    public void after() {
        System.out.println("测试结束-----------------");
    }
    

    public static void main(String[] args) throws ParseException {
        SerializedLambda resolve = LambdaUtils.resolve(Project::getId);
        Class<?> instantiatedType = resolve.getInstantiatedType();
        String implMethodName = resolve.getImplMethodName();
        System.out.println(instantiatedType);
        System.out.println(implMethodName);
    }

}

首先使用LambdaUtils中的resolve方法解析传入的Lambda表达式,返回一个SerializedLambda对象
SerializedLambda.getInstantiatedType()方法可以获得到对应的类信息。SerializedLambda.getImplMethodName()可以获得到对应方法名。可以配合PropertyNamer类获取到对应字段名,然后通过反射就可以获取到当前字段的所有信息,比如类型等。
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,获取lambda表达式的泛型类型是不直接支持的。Lambda表达式在编译时被转换为函数式接口的实例,而函数式接口可能会定义一个或多个泛型参数。 在Java中,我们不能直接获取lambda表达式的泛型类型,因为泛型类型被擦除了(type erasure)。在运行时,泛型类型信息是不可用的。Lambda表达式只能通过函数式接口中定义的方法来访问参数和返回类型。 然而,可以通过一些间接的方式来获取lambda表达式的泛型类型。例如,可以使用反射来获取函数式接口的类型信息,并进一步获取泛型参数的类型。以下是一个示例: ```java import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main { public static void main(String[] args) { MyInterface<String> myObj = s -> System.out.println(s); Type type = myObj.getClass().getGenericInterfaces()[0]; if (type instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) type; Type[] typeArguments = parameterizedType.getActualTypeArguments(); for (Type typeArgument : typeArguments) { System.out.println(typeArgument); } } } } interface MyInterface<T> { void doSomething(T t); } ``` 在上述示例中,我们创建了一个使用String类型的lambda表达式,并使用反射来获取lambda表达式实现的函数式接口的泛型类型。需要注意的是,这种方式只适用于已知函数式接口的情况,并且只能获取泛型参数的类型,无法获取具体的类型参数。 总结起来,虽然在Java中不能直接获取lambda表达式的泛型类型,但可以通过反射间接获取函数式接口的泛型信息。然而,这种方式的适用范围有限,并且可能会增加代码的复杂性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值