clojure java interop for com.google.cloud.storage.StorageImpl
尝试使用带有字节数组的clojure java interop for com.google.cloud.storage.StorageImpl,java,clojure,google-cloud-platform,clojure-java-interop,Java,Clojure,Google Cloud Platform,Clojure Java Interop,尝试使用带有字节数组的create方法进行java互操作 我的答复中有: user=> (->> s r/reflect :members (filter #(instance? clojure.reflect.Method %)) (filter #(:public (:flags %))) (filter #(= (str (:name %)) "create"))
create
方法进行java互操作
我的答复中有:
user=> (->> s r/reflect :members
(filter #(instance? clojure.reflect.Method %))
(filter #(:public (:flags %)))
(filter #(= (str (:name %)) "create"))
(print-table [:name :flags :parameter-types]))
| :name | :flags | :parameter-types |
|--------+---------------------+------------------------------------------------------------------------------------------------------------|
| create | #{:varargs :public} | [com.google.cloud.storage.BlobInfo byte<> com.google.cloud.storage.Storage$BlobTargetOption<>] |
但是当我去调用.create
,我得到:
user=> (.create s blob-info (bytes b))
java.lang.IllegalArgumentException: No matching method create found taking 2 args for class com.google.cloud.storage.StorageImpl
如果我尝试添加nil
作为第三个参数,我会在3个参数中得到相同的错误
我是不是漏掉了什么明显的东西?谢谢
编辑:非常相似,而且更通用(这很好)。这是一个关于一个特定的创建
函数签名的特定问题。我不确定(字节b)
是正确的语法(whidbey/bin是什么?)
也许试试
(byte-array [1 2 3])
或类似的。您也可以尝试键入提示参数:
(.create s
blob-info
^"[B" (byte-array [1 2 3]) ; type-hinted param
)
更新
下面是一个暗示类型的示例,我认为您需要:
(let [byte-array-obj (byte-array [1 2 3])
sss (java.util.Arrays/toString ^"[B" byte-array-obj) ]
(spyxx byte-array-obj)
(spyx (type byte-array-obj))
(spyx (aget byte-array-obj 2))
(spyx sss))
结果:
byte-array-obj => <#[B #object["[B" 0x26071f95 "[B@26071f95"]>
(type byte-array-obj) => [B
(aget byte-array-obj 2) => 3
sss => "[1, 2, 3]"
两者都是等价的。答案是(来自clojurians slack上的seancorfield),blob info
是一个BuilderImpl
内部类,需要是一个实际的BlobInfo
。有效的代码:
(defn get-storage []
(-> (StorageOptions/getDefaultInstance)
(.getService)))
(defn get-blob-info [bucket storage-key]
(let [content-type "text/plain"
blob-id (BlobId/of bucket storage-key)
builder (doto
(BlobInfo/newBuilder blob-id)
(.setContentType content-type))]
(.build builder)))
(defn upload-str [bucket storage-key str-to-store]
(let [storage (get-storage)
blob-info (get-blob-info bucket storage-key)
byte-arr (.getBytes str-to-store)]
(.create storage
blob-info
byte-arr
(into-array Storage$BlobTargetOption []))))
不需要类型暗示结束-只需要类型正确排列。-它与我从docker容器使用的repl一起提供。强制转换到字节数组并没有起到作用。这似乎与clojure能够通过其签名找到类上的函数有关,而我在确定正确的咒语方面遇到了问题。您喜欢的函数的可能副本没有使用两个参数,而是使用三个参数。在java中,您只需使用两个参数就可以调用它,因为编译器会负责。JVM总是接受第三个参数;这种类型的数组,即使emptyAah很高兴发现这一点!谢谢
(java.util.Arrays/toString ^"[B" byte-array-obj) ; type hint using a string
(java.util.Arrays/toString ^bytes byte-array-obj) ; Clojure "build-in" type hint
(defn get-storage []
(-> (StorageOptions/getDefaultInstance)
(.getService)))
(defn get-blob-info [bucket storage-key]
(let [content-type "text/plain"
blob-id (BlobId/of bucket storage-key)
builder (doto
(BlobInfo/newBuilder blob-id)
(.setContentType content-type))]
(.build builder)))
(defn upload-str [bucket storage-key str-to-store]
(let [storage (get-storage)
blob-info (get-blob-info bucket storage-key)
byte-arr (.getBytes str-to-store)]
(.create storage
blob-info
byte-arr
(into-array Storage$BlobTargetOption []))))