1. Обзор
В этом руководстве мы узнаем, что означает [Ljava.lang.Object,
и как получить доступ к правильным значениям объекта.
2. Класс объектов Java
В Java, если мы хотим напечатать значение непосредственно из объекта, первое, что мы можем попробовать, это вызвать его метод toString :
Object[] arrayOfObjects = { "John", 2, true };
assertTrue(arrayOfObjects.toString().startsWith("[Ljava.lang.Object;"));
Если мы запустим тест, он будет успешным, но обычно это не очень полезный результат.
Что мы хотим сделать, так это напечатать значения внутри массива. Вместо этого у нас есть [Ljava.lang.Object.
Имя класса, реализованное в Object.class
:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Когда мы получаем имя класса непосредственно из объекта, мы получаем внутренние имена из JVM с их типами, поэтому у нас есть дополнительные символы, такие как [
и L
, они представляют типы Array и ClassName соответственно.
3. Печать значимых значений
Чтобы иметь возможность правильно распечатать результат, мы можем использовать некоторые классы из пакета java.util
.
3.1. Массивы
Например, мы можем использовать два метода класса Arrays
для преобразования.
С одномерными массивами мы можем использовать метод toString
:
Object[] arrayOfObjects = { "John", 2, true };
assertEquals(Arrays.toString(arrayOfObjects), "[John, 2, true]");
Для более глубоких массивов у нас есть метод deepToString
:
Object[] innerArray = { "We", "Are", "Inside" };
Object[] arrayOfObjects = { "John", 2, innerArray };
assertEquals(Arrays.deepToString(arrayOfObjects), "[John, 2, [We, Are, Inside]]");
3.2. Потоковое
Одной из значительных новых возможностей JDK 8 является введение потоков Java , которые содержат классы для обработки последовательностей элементов:
Object[] arrayOfObjects = { "John", 2, true };
List<String> listOfString = Stream.of(arrayOfObjects)
.map(Object::toString)
.collect(Collectors.toList());
assertEquals(listOfString.toString(), "[John, 2, true]");
Во-первых, мы создали поток, используя вспомогательный метод .
Мы преобразовали все объекты внутри массива в строку, используя карту,
затем мы вставили их в список, используя сбор
для вывода значений.
4. Вывод
В этом руководстве мы увидели, как можно вывести значимую информацию из массива и избежать стандартного [Ljava.lang.Object;.
Мы всегда можем найти исходный код этой статьи на GitHub .