作者:吕贞吟明辉碧瑜 | 来源:互联网 | 2022-12-01 13:58
我有一个Class>
任意类型的参考.如何获得该类型的初始化值?是否有一些库方法或我必须自己滚动,如:
Class> klass = ...
Object init =
(klass == boolean.class)
? false
: (klass == byte.class)
? (byte) 0
...
: (Object) null;
用例是我有一个任意java.lang.reflect.Method
引用,我想用任意参数调用(对于某些测试),这可能不是null
在参数是基本类型的情况下,所以我需要指定该类型的某个值.
1> Holger..:
要在没有第三方库的情况下执行此操作,您可以创建一个长度为1的数组并读出其第一个元素(两个操作都通过java.lang.reflect.Array
):
Object o = Array.get(Array.newInstance(klass, 1), 0);
从Java 9开始,您也可以使用
Object o = MethodHandles.zero(klass).invoke();
@LukasEder当方法句柄是一个选项时,你可以将`zero`句柄直接绑定到参数,避免任何转换/装箱开销,例如`MethodHandle handle = MethodHandles.lookup().unreflect(method); while(handle.type().parameterCount()!= 0)handle = MethodHandles.collectArguments(handle,0,MethodHandles.zero(handle.type().parameterType(0)));/*prepared ...*/handle.invoke(); //使用all-default values`调用方法
2> awesoon..:
您可以使用Defaults
guava库中的类:
public static void main(String[] args) {
System.out.println(Defaults.defaultValue(boolean.class));
System.out.println(Defaults.defaultValue(int.class));
System.out.println(Defaults.defaultValue(String.class));
}
打印:
false
0
null