在Clojure中,给定一个类名作为字符串,我需要创建一个新的类实例.换句话说,我如何在中实现new-instance-from-class-name
(def my-class-name "org.myorg.pkg.Foo")
; calls constructor of org.myorg.pkg.Foo with arguments 1, 2 and 3
(new-instance-from-class-name my-class-name 1 2 3)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个更优雅的解决方案
在实践中,我将在使用defrecord创建的类上使用它.因此,如果该场景有任何特殊语法,我会非常感兴趣.
我是clojure和java的新手.
为了访问Clojure中的Java字段,您可以:
Classname/staticField
Run Code Online (Sandbox Code Playgroud)
这是一样的
(. Classname staticField)
Run Code Online (Sandbox Code Playgroud)
(如我错了请纠正我)
当变量中保存的字段名称时,如何访问静态字段?即:
(let [key-stroke 'VK_L
key-event KeyEvent/key-stroke])
Run Code Online (Sandbox Code Playgroud)
我想key-stroke在尝试访问该字段之前将其评估为符号VK_L.
使用Java反射,可以获得构造函数getConstructor(klass, args).
但是,当我们作为args构造函数签名中指定的类的派生类传递时,它将失败.如何克服这个问题?
例如,
HashSet.class.getConstructor(new Class[]{ HashSet.class });
Run Code Online (Sandbox Code Playgroud)
失败.而
HashSet.class.getConstructor(new Class[]{ Collection.class });
Run Code Online (Sandbox Code Playgroud)
成功.
我正在寻找可以轻松使用的东西clojure.因此,我更喜欢开箱即用,而不必添加用户定义的功能.
任何想法,如何解决这个问题?
在clojure中,我想在函数内创建一个记录.
我试过了:
(defn foo []
(defrecord MyRecord [a b])
(let [b (MyRecord. "1" "2")]))
Run Code Online (Sandbox Code Playgroud)
但它会导致异常:
java.lang.IllegalArgumentException: Unable to resolve classname: MyRecord
Run Code Online (Sandbox Code Playgroud)
任何的想法?