学习 Clojure/调用 Java
外观
- (. 实例方法参数*)
- (. 类方法参数*)
特殊形式 .
也称为 宿主,调用公共 Java 方法或检索公共 Java 字段的值
(. foo bar 7 4) ; call the method bar of the instance/class foo with arguments 7 and 4
(. alice bob) ; return the value of public field bob of the instance/class alice
请注意,访问字段可能会被误认为是调用无参数方法:如果一个类具有无参数方法和同名的公共字段,则通过假设调用方法是预期的来解决歧义。
如果 . 的第一个参数是符号,则符号将以特殊方式求值:如果符号解析为当前命名空间中引用的类,则这是对该类的静态方法之一的调用;否则,这是对从符号解析的实例的方法的调用。因此,令人困惑的是,将 . 与未引用的符号一起使用来解析为类,是对该类对象的实例方法的调用,而不是对该类对象所代表的类的静态方法的调用
(. String valueOf \c) ; invoke the static method String.valueOf(char) with argument 'c'
(def ned String) ; interned Var mapped to ned now holds the Class of String
(. ned valueOf \c) ; exception: attempt to call Class.valueOf, which doesn't exist
虽然 . 运算符是访问 java 的通用运算符,但存在更易读的阅读器宏,应优先使用它们而不是直接使用 .
- (.字段实例参数*)
- 类/静态字段 或 (类/静态方法参数*)
注意:在 Subversion 修订版 1158 之前,.field 也可用于静态访问。但是,在最近版本的 Clojure 中,(.field 类名) 形式将被视为 类名 是类 java.lang.Class 的相应实例。
因此,上面的示例将写成
(String/valueOf \c) ; Static method access!
(def ned String)
(.valueOf ned \c) ; This will fail
(.valueOf String \c) ; And in recent versions, so will this.
如果有必要操作类对象,例如调用 Class.newInstance 方法,可以执行以下操作
(. (identity String) newInstance "fred") ; will create a new instance; this will work in all versions of clojure
(.newInstance String "fred") ; will work only in a recent enough version of clojure. Expands to the above form.
(.newInstance (identity String) "fred") ; this was required in old versions
- (new 类参数*)
特殊形式 new
实例化 Java 类,使用提供的参数调用其构造函数
(new Integer 3) ; instantiate Integer, passing 3 as argument to the constructor
与使用 . 调用静态方法一样,类必须指定为符号,而不是您想要实例化的类的类对象
(new String "yo") ; new String("yo")
(def ned String) ; interned Var mapped to ned now holds the Class of String
(new ned "yo") ; exception: new Class("yo") is invalid
也存在用于 new 的阅读器宏
- (类名. 参数*)
(String. "yo") ; equivalent to (new String "yo"). Notice the dot!