support private method invoke with null parameter

This commit is contained in:
金戟 2021-01-21 22:03:53 +08:00
parent 369c2bd192
commit 6951b98c7e
3 changed files with 22 additions and 3 deletions

View File

@ -32,7 +32,7 @@ public class DemoPrivateAccess {
* private static method with arguments
*/
private static String privateStaticFuncWithArgs(String str, int i) {
return str + " + " + i;
return (str == null ? "null" : str) + " + " + i;
}
/**

View File

@ -8,6 +8,7 @@ import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
/**
* 演示私有成员访问功能
@ -57,6 +58,20 @@ class DemoPrivateAccessTest {
void should_able_to_update_final_field() {
demoPrivateAccess.pi = 4.13;
assertEquals(Double.valueOf(4.13), demoPrivateAccess.pi);
PrivateAccessor.set(demoPrivateAccess, "pi", 3.14);
assertEquals(Double.valueOf(3.14), PrivateAccessor.get(demoPrivateAccess, "pi"));
}
@Test
void should_able_to_use_null_parameter() {
demoPrivateAccess.pi = null;
assertNull(demoPrivateAccess.pi);
assertEquals("null + 1", DemoPrivateAccess.privateStaticFuncWithArgs(null, 1));
PrivateAccessor.set(demoPrivateAccess, "pi", null);
assertNull(PrivateAccessor.get(demoPrivateAccess, "pi"));
assertEquals("null + 1", PrivateAccessor.invokeStatic(DemoPrivateAccess.class, "privateStaticFuncWithArgs", null, 1));
}
}

View File

@ -15,7 +15,8 @@ public class TypeUtil {
public static Class<?>[] getClassesFromObjects(Object[] parameterObjects) {
Class<?>[] cs = new Class[parameterObjects.length];
for (int i = 0; i < cs.length; i++) {
cs[i] = parameterObjects[i].getClass();
Object pObj = parameterObjects[i];
cs[i] = (pObj == null) ? null : pObj.getClass();
}
return cs;
}
@ -41,7 +42,7 @@ public class TypeUtil {
/**
* type equals
* @param classesLeft class to be compared
* @param classesRight class to compare
* @param classesRight class to compare (item can be null)
* @return whether all class equals
*/
private static boolean typeEquals(Class<?>[] classesLeft, Class<?>[] classesRight) {
@ -49,6 +50,9 @@ public class TypeUtil {
return false;
}
for (int i = 0; i < classesLeft.length; i++) {
if (classesRight[i] == null) {
return !classesLeft[i].isPrimitive();
}
if (!classesLeft[i].isAssignableFrom(classesRight[i]) && !fuzzyEqual(classesLeft[i], classesRight[i])) {
return false;
}