如何通过Clojure interop访问静态内部Java类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

基本上我需要做的是

FileChannel.MapMode.READ_ONLY

我试着做一些显而易见的事情

(.. FileChannel MapMode READ_ONLY)

但最终抛出一个异常

java.lang.NoSuchFieldException: MapMode

甚至/属性中的访问静态字段指定的符号。互操作文档产生相同的异常

(. (FileChannel/MapMode) READ_ONLY)
提问于
用户回答回答于

使用$访问内部类

java.nio.channels.FileChannel$MapMode/READ_ONLY
用户回答回答于

语法(FileChannel/MapMode)是一种简化,只适用于静态字段和方法(对于字段,您甚至可以省略括号)!还有...表单用于字段/方法,而不是嵌套/内部类!

对于JVM,一个内部类Outer.Inner只是一个名为Outer$Inner(编译器创建一个文件Outer$Inner.class)。Java编译器允许您通过Outer.Inner...。还可以定义名为Outer$Inner编译器允许您将其称为Outer$Inner...。但是,您不能同时定义这两者,因为这两个类的类名都是Outer$Inner(和.class文件名Outer$Inner.class,这将是一个重复的类名!)

当使用反射时-例如Class.forName()-(通常是为了引入一些动态)您不能省略导入类的包名,必须在$符号而不是点。

可能是因为它的动态特性,Clojure采用了相同的方法,因此您需要使用以下形式my.package.Outer$Inner如果类在my.package-即使你已经进口了外层!为了避免包名,可以显式导入内部类。my.package.Outer$Inner然后把它称为Outer$Inner(它的真实类名!)但您不会将其简化为Inner只需进口:

Inner对jvm没有任何意义,只有Java-Compiler从编译时上下文(jvm和类似的方法不可用)提供了这个快捷方式。Class.forName在运行时!)。好的,当然,在Clojure中,您可以始终定义:(def Inner Outer$Inner)...或(def Tom Outer$Inner)(def Harry Outer$Inner)或者其他什么

扫码关注云+社区

领取腾讯云代金券