基本上我需要做的是
FileChannel.MapMode.READ_ONLY
我试着做一些显而易见的事情
(.. FileChannel MapMode READ_ONLY)
但这最终抛出了一个异常
java.lang.NoSuchFieldException: MapMode
即使在interop documentation中为访问静态字段指定的/
表示法也会产生相同的异常
(. (FileChannel/MapMode) READ_ONLY)
发布于 2011-08-22 04:32:19
使用$访问内部类
java.nio.channels.FileChannel$MapMode/READ_ONLY
请注意,如果您正在导入FileChannel
,您也应该导入FileChannel$MapMode
。
发布于 2012-06-04 22:08:10
语法(FileChannel/MapMode)
是一种简化,仅用于静态字段和方法(对于字段,您甚至可以省略括号)!此外,.
和..
表单是针对字段/方法的,而不是针对嵌套/内部类的!
对于JVM,内部类Outer.Inner
只是一个名为Outer$Inner
的类(编译器为此创建了一个文件Outer$Inner.class
)。Java编译器允许您通过Outer.Inner
引用它。您还可以定义一个名为Outer$Inner
的非内部类,编译器允许您将其引用为Outer$Inner
。但是,您不能同时定义这两个文件,因为两者的类名都是Outer$Inner
(以及名为Outer$Inner.class
的.class
文件,因此这将是一个重复的类名!)
当使用反射时-例如使用Class.forName()
-(通常是为了引入一些动态性),你不能省略导入类的包名,你必须使用带有$
符号而不是点的真实类名。
可能是因为它的动态特性,Clojure采用了相同的方法,所以如果类是my.package
格式的,那么就需要使用表单my.package.Outer$Inner
--即使您已经导入了外部类!为了避免包名,您可以显式地导入内部类my.package.Outer$Inner
,然后将其引用为Outer$Inner
(它的真实类名!)但您不能通过简单地导入它来将其缩减为Inner
:
Inner
对Java虚拟机没有任何意义,只是Java编译器从编译时上下文为您提供了这个快捷方式(这对于Java虚拟机和像Class.forName
这样的方法在运行时是不可用的!) ...当然,在Clojure中,你总是可以定义:(def Inner Outer$Inner)
...或者(def Tom Outer$Inner)
或者(def Harry Outer$Inner)
或者其他什么..。如果你更喜欢的话。
https://stackoverflow.com/questions/7140843
复制相似问题