は、あなたがこのように定義するとき、あなたはその後、2つのオプションを持っているのjava.lang.Class
(def a java.lang.String)
(type a)
=> java.lang.Class
を含むVARを得る構築しますリフレクションAPIを使用してJavaコンストラクタを見つけることによって、新しいインスタンスを動的に更新します。
(defn construct [klass & args]
(.newInstance
(.getConstructor klass (into-array java.lang.Class (map type args)))
(object-array args)))
(construct a "Foobar!")
=> "Foobar!"
B:Yehonathanが指摘するようにあなたは、コンストラクタのシグネチャで定義された正確なクラスを(それが正しい署名を見つけることができませんとして、サブクラスが動作しません)を使用する必要があることに注意してくださいClojureののを使用して構築evalのを必要とするJava相互運用機能、:方法Aはかなり速いこと
(defn new-class [klass & args]
(eval `(new ~klass [email protected])))
(new-class a "Hello!")
=> "Hello!"
注(約60倍速く私のマシン上で)、私はそれが各evalの文のClojureのコンパイラを呼び出すのオーバーヘッドを回避主な理由だと思います。
私はこれが以前に起きていたと確信していました:[Clojure:String class nameから新しいインスタンスを作成する]を参照してください(http:// stackoverflow。Chouserの偉大な答えで、 'clojure.lang.Reflector/invokeConstructor'と別のアプローチ、「静的+高速」と「動的+遅い」の中間的な中間地点を挙げています(com/q/3748559/232707)それを「とてもダイナミック+スロー、静的+速い」と呼びます)、これはあなたの興味を引くかもしれません。 –