2011-08-21 3 views
49

는 기본적으로 내가 뭘해야이Clojure interop을 통해 정적 내부 Java 클래스에 액세스하는 방법은 무엇입니까?

FileChannel.MapMode.READ_ONLY 

내가 분명

(.. FileChannel MapMode READ_ONLY) 

일을 시도하지만 그

java.lang.NoSuchFieldException: MapMode 

/ 표기법에 대한로 지정된 예외를 던지는 끝 interop documentation의 정적 필드에 액세스하면 동일한 예외가 발생합니다.

(. (FileChannel/MapMode) READ_ONLY) 

답변

75

당신은 $

java.nio.channels.FileChannel$MapMode/READ_ONLY 
+27

'import' 함수 또는': import' 키워드를 사용하여 FileChannel을 가져 오는 경우'FileChannel $ MapMode'를 가져 오도록 지정해야합니다. –

+1

감사합니다. @TerjeDahl. 나는 이것을 포함하도록 질문을 편집해야한다고 생각합니다, 함자 예 를리 카야. – Joe

11

구문 (FileChannel/MapMode)와 내부 클래스에 액세스은 단순화 및 (필드, 당신도 괄호를 생략 할 수 있습니다) 정적 필드와 메소드 만 것입니다! 또한 ... 양식은 필드/메소드 용이지만 중첩/내부 클래스 용은 아닙니다!

JVM의 경우 내부 클래스 Outer.InnerOuter$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는 아무런 의미가 없다 JVM, 자바 컴파일러 만 있으면 컴파일 타임 컨텍스트 (런타임에서는 Class.forName과 같은 JVM에서 사용할 수 없음)에서 바로 가기를 제공합니다 ... Clojure에서 다음과 같이 정의 할 수 있습니다. (def Inner Outer$Inner) ... 또는 (def Tom Outer$Inner) 또는 (def Harry Outer$Inner) 또는 기타 ... 원하는 것이 더 좋다면.

+0

이것은 아마도 좋은 설명 일 것입니다. 고마워. – tutysara

관련 문제