如何获取Java类引用的初始化值

Luk*_*der 12 java reflection initialization default-value

我有一个Class<?>任意类型的参考.如何获得该类型的初始化值?是否有一些库方法或我必须自己滚动,如:

Class<?> klass = ...
Object init = 
    (klass == boolean.class)
  ? false
  : (klass == byte.class)
  ? (byte) 0
  ...
  : (Object) null;
Run Code Online (Sandbox Code Playgroud)

用例是我有一个任意java.lang.reflect.Method引用,我想用任意参数调用(对于某些测试),这可能不是null在参数是基本类型的情况下,所以我需要指定该类型的某个值.

Hol*_*ger 20

要在没有第三方库的情况下执行此操作,您可以创建一个长度为1的数组并读出其第一个元素(两个操作都通过java.lang.reflect.Array):

Object o = Array.get(Array.newInstance(klass, 1), 0);
Run Code Online (Sandbox Code Playgroud)

从Java 9开始,您也可以使用

Object o = MethodHandles.zero(klass).invoke();
Run Code Online (Sandbox Code Playgroud)

  • @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`调用方法 (3认同)

awe*_*oon 7

您可以使用Defaultsguava库中的类:

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));
}
Run Code Online (Sandbox Code Playgroud)

打印:

false
0
null
Run Code Online (Sandbox Code Playgroud)