Как получить доступ к статическому внутреннему классу Java через взаимодействие Clojure?
7480 просмотра
2 ответа
В основном, что мне нужно сделать, это
FileChannel.MapMode.READ_ONLY
Я пытался сделать очевидное
(.. FileChannel MapMode READ_ONLY)
но в конечном итоге бросает исключение
java.lang.NoSuchFieldException: MapMode
даже /
обозначение, указанное для статических полей доступа в документации взаимодействия, выдает то же исключение
(. (FileChannel/MapMode) READ_ONLY)
Автор: Jakub Arnold
Источник
Размещён: 12.11.2019 09:13
Ответы (2)
85 плюса
Вы получаете доступ к внутренним классам с помощью $
java.nio.channels.FileChannel$MapMode/READ_ONLY
Автор: Hamza Yerlikaya
Размещён: 21.08.2011 08:32
15 плюса
Синтаксис (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-компилятор предлагает вам этот ярлык из контекста времени компиляции (который не доступен для JVM и методов как Class.forName
во время выполнения!) ... Хорошо, в Clojure вы, конечно, всегда можете определите: (def Inner Outer$Inner)
... или (def Tom Outer$Inner)
или (def Harry Outer$Inner)
или как угодно ... если вам это нравится больше.
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- interop Вызов команд оболочки из Ruby
- interop Пример кода для использования IBM PCOMM в C # o для написания скребка as400
- interop Как правильно очистить объекты взаимодействия Excel?
- interop Ссылка на движок Google V8 от приложения .NET.
- interop Better way to cast object to int
- interop Вызов C # кода из C ++
- clojure Есть ли реальный опыт использования программной транзакционной памяти?
- clojure Каков наилучший способ сделать GUI в Clojure?
- clojure Быстрая генерация простых чисел в Clojure
- clojure Что такое закрытый эквивалент идиомы Python "if __name__ == '__main__'"?
- clojure Отображение функции по значениям карты в Clojure
- clojure Clojure: Как вернуться к исключению?