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; package cn.hutool.core.lang.func;
import org.junit.Assert;
import org.junit.Test;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.junit.Assert;
import org.junit.Test;
import java.lang.invoke.MethodHandleInfo; import java.lang.invoke.MethodHandleInfo;
@ -13,13 +12,13 @@ public class LambdaUtilTest {
@Test @Test
public void getMethodNameTest() { public void getMethodNameTest() {
String methodName = LambdaUtil.getMethodName(MyTeacher::getAge); final String methodName = LambdaUtil.getMethodName(MyTeacher::getAge);
Assert.assertEquals("getAge", methodName); Assert.assertEquals("getAge", methodName);
} }
@Test @Test
public void getFieldNameTest() { public void getFieldNameTest() {
String fieldName = LambdaUtil.getFieldName(MyTeacher::getAge); final String fieldName = LambdaUtil.getFieldName(MyTeacher::getAge);
Assert.assertEquals("age", fieldName); Assert.assertEquals("age", fieldName);
} }
@ -46,38 +45,38 @@ public class LambdaUtilTest {
@Test @Test
public void getRealClassTest() { public void getRealClassTest() {
// 引用特定类型的任意对象的实例方法 // 引用特定类型的任意对象的实例方法
Class<MyTeacher> functionClass = LambdaUtil.getRealClass(MyTeacher::getAge); final Class<MyTeacher> functionClass = LambdaUtil.getRealClass(MyTeacher::getAge);
Assert.assertEquals(MyTeacher.class, functionClass); 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); 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); 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); 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); 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); 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); 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); 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); 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); Assert.assertEquals(MyTeacher.class, staticSuperSupplierClass);
} }
@ -97,7 +96,7 @@ public class LambdaUtilTest {
return new Entity<T>().getId(); 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(); return entity.getId();
} }
@ -112,7 +111,7 @@ public class LambdaUtilTest {
return new MyTeacher().getAge(); return new MyTeacher().getAge();
} }
public static String takeAgeBy(MyTeacher myTeacher) { public static String takeAgeBy(final MyTeacher myTeacher) {
return myTeacher.getAge(); return myTeacher.getAge();
} }
@ -133,4 +132,17 @@ public class LambdaUtilTest {
REF_invokeSpecial, REF_invokeSpecial,
REF_newInvokeSpecial, 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();
}
}
} }