bu şekilde bir tanımladığınızda, sonra 2 seçeneğiniz var bir java.lang.Class
(def a java.lang.String)
(type a)
=> java.lang.Class
içeren bir var olsun Construct yansıtma API'sini kullanarak Java yapıcısını bularak dinamik olarak yeni örneği. Yehonathan işaret gibi yapıcı imza tanımlanan kesin sınıfını kullanmak gerekir unutmayın (doğru imzayı bulamaz gibi bir alt sınıf işe yaramaz):
(defn construct [klass & args]
(.newInstance
(.getConstructor klass (into-array java.lang.Class (map type args)))
(object-array args)))
(construct a "Foobar!")
=> "Foobar!"
B: kullanarak Clojure en Construct , bir değerlendirme gerektirir Java birlikte çalışma,: her eval deyimi için Clojure derleyici çağırmak yükünden kaçınmak çünkü yöntem A ölçüde daha hızlı olduğunu
(defn new-class [klass & args]
(eval `(new ~klass [email protected])))
(new-class a "Hello!")
=> "Hello!"
Not (yaklaşık 60x daha hızlı benim makinede), ben esas olarak düşünüyorum.
Bunun daha önce ortaya çıktığını ve gerçekten de bunun olduğunu düşündüm: [Clojure: String sınıfı adından yeni örnek oluşturma] (http: // stackoverflow.com/q/3748559/232707) 'clojure.lang.Reflector/invokeConstructor' ve başka bir yaklaşımdan bahseden Chouser tarafından verilen büyük bir yanıtla, "statik + hızlı" ve "dinamik + yavaş" arasında bir tür orta zemin İlginizi çekebilecek olan "çok dinamik + bir kez yavaş, statik + hızlı sonra"). –