Как получить значение инициализации для ссылки на класс Java

У меня есть ссылка Class<?> Для произвольного типа. Как получить значение инициализации этого типа? Есть ли какой-нибудь библиотечный метод для этого или я должен свернуть свой собственный, такой как:

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

Вариант использования: у меня есть произвольная ссылка на java.lang.reflect.Method, которую я хочу вызвать с использованием произвольных параметров (для некоторого тестирования), которые могут не иметь null если параметр является типом примитива, поэтому мне нужно указать какое-то значение этого типа.

Ответ 1

Чтобы сделать это без сторонних библиотек, вы можете создать массив длиной один и прочитать его первый элемент (обе операции через java.lang.reflect.Array):

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

Начиная с Java 9, вы также можете использовать

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

Ответ 2

Вы можете использовать класс 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

Ответ 4

Чтобы проверить, является ли параметр метода примитивным, вызовите isPrimitive(); на тип параметра:

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