Как получить значение инициализации для ссылки на класс 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
Ответ 3
Для полноты картины, это то, что, я думаю, принадлежит API отражений, поэтому я добавил его в jOOR через # 68
Object init = Reflect.initValue(klass);
Примечательно, что в Guava есть похожий инструмент, и есть утилиты JDK, которые тоже могут это делать.
Ответ 4
Чтобы проверить, является ли параметр метода примитивным, вызовите isPrimitive();
на тип параметра:
Method m = ...;
// to test the first parameter only:
m.getParameterTypes()[0].isPrimitive();