This commit is contained in:
Looly 2023-03-08 23:06:21 +08:00
parent 3d10a39ea3
commit bdceb0013d

View File

@ -1,11 +1,10 @@
package cn.hutool.core.lang.func;
import org.junit.Assert;
import org.junit.Test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.junit.Assert;
import org.junit.Test;
import java.lang.invoke.MethodHandleInfo;
@ -13,13 +12,13 @@ public class LambdaUtilTest {
@Test
public void getMethodNameTest() {
String methodName = LambdaUtil.getMethodName(MyTeacher::getAge);
final String methodName = LambdaUtil.getMethodName(MyTeacher::getAge);
Assert.assertEquals("getAge", methodName);
}
@Test
public void getFieldNameTest() {
String fieldName = LambdaUtil.getFieldName(MyTeacher::getAge);
final String fieldName = LambdaUtil.getFieldName(MyTeacher::getAge);
Assert.assertEquals("age", fieldName);
}
@ -46,38 +45,38 @@ public class LambdaUtilTest {
@Test
public void getRealClassTest() {
// 引用特定类型的任意对象的实例方法
Class<MyTeacher> functionClass = LambdaUtil.getRealClass(MyTeacher::getAge);
final Class<MyTeacher> functionClass = LambdaUtil.getRealClass(MyTeacher::getAge);
Assert.assertEquals(MyTeacher.class, functionClass);
// 枚举测试不会导致类型擦除
Class<LambdaKindEnum> enumFunctionClass = LambdaUtil.getRealClass(LambdaKindEnum::ordinal);
final Class<LambdaKindEnum> enumFunctionClass = LambdaUtil.getRealClass(LambdaKindEnum::ordinal);
Assert.assertEquals(LambdaKindEnum.class, enumFunctionClass);
// 调用父类方法能获取到正确的子类类型
Class<MyTeacher> superFunctionClass = LambdaUtil.getRealClass(MyTeacher::getId);
final Class<MyTeacher> superFunctionClass = LambdaUtil.getRealClass(MyTeacher::getId);
Assert.assertEquals(MyTeacher.class, superFunctionClass);
MyTeacher myTeacher = new MyTeacher();
final MyTeacher myTeacher = new MyTeacher();
// 引用特定对象的实例方法
Class<MyTeacher> supplierClass = LambdaUtil.getRealClass(myTeacher::getAge);
final Class<MyTeacher> supplierClass = LambdaUtil.getRealClass(myTeacher::getAge);
Assert.assertEquals(MyTeacher.class, supplierClass);
// 枚举测试只能获取到枚举类型
Class<Enum<?>> enumSupplierClass = LambdaUtil.getRealClass(LambdaKindEnum.REF_NONE::ordinal);
final Class<Enum<?>> enumSupplierClass = LambdaUtil.getRealClass(LambdaKindEnum.REF_NONE::ordinal);
Assert.assertEquals(Enum.class, enumSupplierClass);
// 调用父类方法只能获取到父类类型
Class<Entity<?>> superSupplierClass = LambdaUtil.getRealClass(myTeacher::getId);
final Class<Entity<?>> superSupplierClass = LambdaUtil.getRealClass(myTeacher::getId);
Assert.assertEquals(Entity.class, superSupplierClass);
// 引用静态带参方法能够获取到正确的参数类型
Class<MyTeacher> staticFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeAgeBy);
final Class<MyTeacher> staticFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeAgeBy);
Assert.assertEquals(MyTeacher.class, staticFunctionClass);
// 引用父类静态带参方法只能获取到父类类型
Class<Entity<?>> staticSuperFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeId);
final Class<Entity<?>> staticSuperFunctionClass = LambdaUtil.getRealClass(MyTeacher::takeId);
Assert.assertEquals(Entity.class, staticSuperFunctionClass);
// 引用静态无参方法能够获取到正确的类型
Class<MyTeacher> staticSupplierClass = LambdaUtil.getRealClass(MyTeacher::takeAge);
final Class<MyTeacher> staticSupplierClass = LambdaUtil.getRealClass(MyTeacher::takeAge);
Assert.assertEquals(MyTeacher.class, staticSupplierClass);
// 引用父类静态无参方法能够获取到正确的参数类型
Class<MyTeacher> staticSuperSupplierClass = LambdaUtil.getRealClass(MyTeacher::takeIdBy);
final Class<MyTeacher> staticSuperSupplierClass = LambdaUtil.getRealClass(MyTeacher::takeIdBy);
Assert.assertEquals(MyTeacher.class, staticSuperSupplierClass);
}
@ -97,7 +96,7 @@ public class LambdaUtilTest {
return new Entity<T>().getId();
}
public static <T> T takeIdBy(Entity<T> entity) {
public static <T> T takeIdBy(final Entity<T> entity) {
return entity.getId();
}
@ -112,7 +111,7 @@ public class LambdaUtilTest {
return new MyTeacher().getAge();
}
public static String takeAgeBy(MyTeacher myTeacher) {
public static String takeAgeBy(final MyTeacher myTeacher) {
return myTeacher.getAge();
}
@ -133,4 +132,17 @@ public class LambdaUtilTest {
REF_invokeSpecial,
REF_newInvokeSpecial,
}
@Test
public void lambdaClassNameTest() {
final String lambdaClassName1 = LambdaUtilTestHelper.getLambdaClassName(MyTeacher::getAge);
final String lambdaClassName2 = LambdaUtilTestHelper.getLambdaClassName(MyTeacher::getAge);
Assert.assertNotEquals(lambdaClassName1, lambdaClassName2);
}
static class LambdaUtilTestHelper {
public static <P> String getLambdaClassName(final Func1<P, ?> func) {
return func.getClass().getName();
}
}
}