public class LambdaUtil extends Object
Constructor and Description |
---|
LambdaUtil() |
Modifier and Type | Method and Description |
---|---|
static <T> String |
getFieldName(Func0<T> func)
获取lambda表达式Getter或Setter函数(方法)对应的字段名称,规则如下:
getXxxx获取为xxxx,如getName得到name。
|
static <T> String |
getFieldName(Func1<T,?> func)
获取lambda表达式Getter或Setter函数(方法)对应的字段名称,规则如下:
getXxxx获取为xxxx,如getName得到name。
|
static <R> String |
getMethodName(Func0<R> func)
获取lambda表达式函数(方法)名称
|
static <P> String |
getMethodName(Func1<P,?> func)
获取lambda表达式函数(方法)名称
|
static <R> Class<R> |
getRealClass(Func0<?> func)
通过对象的方法或类的静态方法引用,获取lambda实现类
传入lambda无参数但含有返回值的情况能够匹配到此方法:
引用特定对象的实例方法:
MyTeacher myTeacher = new MyTeacher();
Class<MyTeacher> supplierClass = LambdaUtil.getRealClass(myTeacher::getAge);
assertEquals(MyTeacher.class, supplierClass);
引用静态无参方法:
Class<MyTeacher> staticSupplierClass = LambdaUtil.getRealClass(MyTeacher::takeAge);
assertEquals(MyTeacher.class, staticSupplierClass);
在以下场景无法获取到正确类型
{@code
// 枚举测试,只能获取到枚举类型
Class |
static <P,R> Class<P> |
getRealClass(Func1<P,R> func)
通过对象的方法或类的静态方法引用,然后根据
SerializedLambda.getInstantiatedMethodType() 获取lambda实现类传入lambda有参数且含有返回值的情况能够匹配到此方法: 引用特定类型的任意对象的实例方法:
Class<MyTeacher> functionClass = LambdaUtil.getRealClass(MyTeacher::getAge);
assertEquals(MyTeacher.class, functionClass);
引用静态带参方法:
Class<MyTeacher> staticFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeAgeBy);
assertEquals(MyTeacher.class, staticFunctionClass);
|
static <R> SerializedLambda |
resolve(Func0<R> func)
解析lambda表达式,加了缓存。
|
static <T> SerializedLambda |
resolve(Func1<T,?> func)
解析lambda表达式,加了缓存。
|
public static <R> Class<R> getRealClass(Func0<?> func)
MyTeacher myTeacher = new MyTeacher();
Class<MyTeacher> supplierClass = LambdaUtil.getRealClass(myTeacher::getAge);
assertEquals(MyTeacher.class, supplierClass);
Class<MyTeacher> staticSupplierClass = LambdaUtil.getRealClass(MyTeacher::takeAge);
assertEquals(MyTeacher.class, staticSupplierClass);
// 枚举测试,只能获取到枚举类型
Class<Enum<?>> enumSupplierClass = LambdaUtil.getRealClass(LambdaUtil.LambdaKindEnum.REF_NONE::ordinal);
assertEquals(Enum.class, enumSupplierClass);
// 调用父类方法,只能获取到父类类型
Class<Entity<?>> superSupplierClass = LambdaUtil.getRealClass(myTeacher::getId);
assertEquals(Entity.class, superSupplierClass);
// 引用父类静态带参方法,只能获取到父类类型
Class<Entity<?>> staticSuperFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeId);
assertEquals(Entity.class, staticSuperFunctionClass);
R
- 类型func
- lambdaIllegalArgumentException
- 如果是不支持的方法引用,抛出该异常,见checkLambdaTypeCanGetClass(int)
public static <T> SerializedLambda resolve(Func1<T,?> func)
T
- Lambda类型func
- 需要解析的 lambda 对象(无参方法)public static <R> SerializedLambda resolve(Func0<R> func)
R
- Lambda返回类型func
- 需要解析的 lambda 对象(无参方法)public static <P> String getMethodName(Func1<P,?> func)
P
- Lambda参数类型func
- 函数(无参方法)public static <R> String getMethodName(Func0<R> func)
R
- Lambda返回类型func
- 函数(无参方法)public static <P,R> Class<P> getRealClass(Func1<P,R> func)
SerializedLambda.getInstantiatedMethodType()
获取lambda实现类
Class<MyTeacher> functionClass = LambdaUtil.getRealClass(MyTeacher::getAge);
assertEquals(MyTeacher.class, functionClass);
Class<MyTeacher> staticFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeAgeBy);
assertEquals(MyTeacher.class, staticFunctionClass);
P
- 方法调用方类型R
- 返回值类型func
- lambdaIllegalArgumentException
- 如果是不支持的方法引用,抛出该异常,见checkLambdaTypeCanGetClass(int)
public static <T> String getFieldName(Func1<T,?> func) throws IllegalArgumentException
IllegalArgumentException
T
- Lambda类型func
- 函数(无参方法)IllegalArgumentException
- 非Getter或Setter方法public static <T> String getFieldName(Func0<T> func) throws IllegalArgumentException
IllegalArgumentException
T
- Lambda类型func
- 函数(无参方法)IllegalArgumentException
- 非Getter或Setter方法Copyright © 2024. All rights reserved.