首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过Clojure互操作访问静态内部Java类?

如何通过Clojure互操作访问静态内部Java类?
EN

Stack Overflow用户
提问于 2011-08-22 04:12:47
回答 2查看 8.9K关注 0票数 55

基本上我需要做的是

FileChannel.MapMode.READ_ONLY

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

(.. FileChannel MapMode READ_ONLY)

但这最终抛出了一个异常

java.lang.NoSuchFieldException: MapMode

即使在interop documentation中为访问静态字段指定的/表示法也会产生相同的异常

(. (FileChannel/MapMode) READ_ONLY)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-22 04:32:19

使用$访问内部类

java.nio.channels.FileChannel$MapMode/READ_ONLY

请注意,如果您正在导入FileChannel,您也应该导入FileChannel$MapMode

票数 90
EN

Stack Overflow用户

发布于 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)或者其他什么..。如果你更喜欢的话。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7140843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档