【问题标题】:How to get the initialisation value for a Java Class reference如何获取 Java 类引用的初始化值
【发布时间】:2019-03-30 00:25:44
【问题描述】:

我有一个任意类型的Class<?> 引用。如何获得该类型的初始化值?是否有一些库方法可以解决这个问题,还是我必须自己动手,例如:

Class<?> klass = ...
Object init = 
    (klass == boolean.class)
  ? false
  : (klass == byte.class)
  ? (byte) 0
  ...
  : (Object) null;

用例是我有一个任意的java.lang.reflect.Method 引用,我想使用任意参数调用它(用于某些测试),如果参数是原始类型,它可能不是null,所以我需要指定该类型的某个值。

【问题讨论】:

标签: java reflection initialization default-value


【解决方案1】:

为了完整起见,这是我认为属于反射 API 的东西,所以我将它添加到 jOOR#68

Object init = Reflect.initValue(klass);

值得注意的是,Guava has a similar tool 还有JDK utilities that can do this as well

【讨论】:

    【解决方案2】:

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

    Object o = Array.get(Array.newInstance(klass, 1), 0);
    

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

    Object o = MethodHandles.zero(klass).invoke();
    

    【讨论】:

    • 数组技巧的好想法。 MethodHandles.zero(Class) 方法非常酷,对我有用。
    • @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(); // invokes the method with all-default values
    【解决方案3】:

    要检查方法的参数是否原始,请在参数类型上调用isPrimitive();

    Method m = ...;
    // to test the first parameter only:
    m.getParameterTypes()[0].isPrimitive();
    

    【讨论】:

    • 我不需要检查类型是否是原始的。无论特定的原始类型如何,我都想要初始化值。
    【解决方案4】:

    您可以使用番石榴库中的Defaults 类:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 2011-06-13
      • 2021-07-30
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多