Bagaimana cara mendapatkan panjang array byte yang dikembalikan oleh (.getBytes string UTF-8)?

Ada sesuatu yang saya tidak mengerti tentang interop Java. Saya memiliki satu karakter java.lang.String "x". String Java memiliki metode getBytes yang tanda tangannya adalah public byte[] getBytes(String charsetName) throws UnsupportedEncodingException: https://docs.Oracle.com/javase/7/docs/api/java/lang/String.html#getBytes(java.lang.String.

Metode itu mengembalikan satu byte[]. Array Java memiliki properti .length. Mengapa saya mendapatkan IllegalArgumentException di REPL?

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

Bagaimana cara saya mendapatkan panjang array byte yang dikembalikan oleh (.getBytes "x" "UTF-8") dengan benar di clojure?


person Bob Kuhar    schedule 20.01.2019    source sumber


Jawaban (1)


Ada fungsi alength di clojure.core untuk mendapatkan panjang array Java

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

Sejauh yang saya tahu, array Java sebenarnya bukan kelas dengan bidang bernama length, meskipun sintaksis Java myarray.length menyarankan sebaliknya. Mendapatkan panjang array memerlukan instruksi kode byte khusus, bukan akses bidang biasa. Itu sebabnya sintaks interop akses lapangan di Clojure dalam hal ini menghasilkan pengecualian. Dan untuk alasan yang sama diperlukan fungsi alength tujuan khusus.

person ez121sl    schedule 20.01.2019
comment
Ah. Itu ada. Array Java sebenarnya bukan kelas. Terima kasih - person Bob Kuhar; 20.01.2019