Как получить длину массива байтов, возвращаемого (строка .getBytes UTF-8)?

Что-то я не понимаю в Java-взаимодействии. У меня есть один символ java.lang.String "x". Строки Java имеют метод getBytes с подписью public byte[] getBytes(String charsetName) throws UnsupportedEncodingException: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes(java.lang.String.

Этот метод возвращает byte[]. Массивы Java имеют свойство .length. Почему я получаю исключение IllegalArgumentException в REPL?

(.length (.getBytes "x" "UTF-8"))
IllegalArgumentException No matching field found: length for class [B  clojure.lang.Reflector.getInstanceField (Reflector.java:271)

Как правильно получить длину массива байтов, возвращаемого (.getBytes "x" "UTF-8") в clojure?


person Bob Kuhar    schedule 20.01.2019    source источник


Ответы (1)


В clojure.core есть функция alength для получения длины массивов Java.

(alength (.getBytes "x" "UTF-8"))
;;=> 1

Насколько мне известно, массивы Java на самом деле не являются классами с полем length, хотя синтаксис Java myarray.length предполагает обратное. Для получения длины массива требуется специальная инструкция байт-кода, а не обычный доступ к полю. Вот почему синтаксис взаимодействия при доступе к полю в Clojure в этом случае приводит к исключению. И по той же причине требуется специальная функция alength.

person ez121sl    schedule 20.01.2019
comment
Ах. Вот оно. Массивы Java на самом деле не являются классами. Спасибо - person Bob Kuhar; 20.01.2019