#java
#java
Вопрос:
Я просматривал код целочисленного класса и заметил, что MIN_VALUE и MAX_VALUE помечены @native . Мой вопрос
-
Какова цель использования @native аннотации?
-
Где мы можем найти машинный код, который используется @native ?
-
Есть ли какой-либо вариант использования, в котором мы должны использовать @native аннотацию в обычном программировании?
public final class Integer extends Number implements Comparable<Integer> { /** * A constant holding the minimum value an {@code int} can * have, -2<sup>31</sup>. */ @Native public static final int MIN_VALUE = 0x80000000; /** * A constant holding the maximum value an {@code int} can * have, 2<sup>31</sup>-1. */ @Native public static final int MAX_VALUE = 0x7fffffff;
@native документация гласит
/**
* Indicates that a field defining a constant value may be referenced
* from native code.
Комментарии:
1. Прочитайте остальную часть javadoc : «Указывает, что на поле, определяющее постоянное значение, можно ссылаться из собственного кода. Аннотация может использоваться в качестве подсказки инструментами, которые генерируют собственные заголовочные файлы , чтобы определить, требуется ли файл заголовка, и если да, то какие объявления он должен содержать. »
2. Что касается вашего второго вопроса, найдите исходный код Java на GitHub, он также содержит большую часть собственного кода.
Ответ №1:
-
В основном это предназначено для автоматической генерации собственного кода. Таким образом, такие константы могут быть легко использованы машинным кодом.
-
И наоборот: машинный код может использовать такую константу.
-
Если вы имеете в виду normal==Java, то ответ отрицательный.
Комментарии:
1. «автоматическая генерация собственного кода» — вы имеете в виду JIT? Разве это не то, что делает JIT, генерирует машинный код для более быстрого выполнения? Итак, вы, должно быть, имеете в виду JIT, верно? — Нееет…. Возможно, вы имеете в виду JNI…. Да…. Может быть? Было бы неплохо уточнить.
2. @Andreas Нет, это не относится к JIT. Это также не относится к JNI, не совсем так. Любой инструмент, который может генерировать машинный код, может использовать эти аннотации в качестве подсказок. Не указано, какие это могут быть инструменты. Существует множество инструментов, которые генерируют склеивающий код / машинный код, некоторые из них могут использовать JNI, некоторые JNA.
Ответ №2:
Java 8 javadoc включает в себя следующие предложения:
«Указывает, что на поле, определяющее постоянное значение, можно ссылаться из собственного кода. Аннотация может использоваться в качестве подсказки инструментами, которые генерируют собственные заголовочные файлы, чтобы определить, требуется ли файл заголовка, и если да, то какие объявления он должен содержать. «
Итак:
- Какова цель использования @native аннотации?
Смотрите выше.
- Где мы можем найти машинный код, который используется @native ?
Сгенерированные заголовочные файлы и любые ссылки на собственный код на вышеуказанные символы ( MIN_VALUE
и MAX_VALUE
) будут находиться в дереве исходных текстов OpenJDK Java. (Обычно я отслеживаю ссылки на символы в исходном дереве, используя комбинацию find
, xargs
и grep
, но, вероятно, есть способы получше.)
- Есть ли какой-либо вариант использования, в котором мы должны использовать @native аннотацию в обычном программировании?
Одним из случаев может быть, если вы реализуете свои собственные API, которые включают собственный код и сгенерированные собственные заголовочные файлы.
Но если вы имеете в виду варианты использования в (чистом виде) Код Java, я не могу придумать ни одного 1.
1 — Помимо уже отмеченных (например, JNI и т. Д. Собственные генераторы заголовков) И бессмысленных (например, инструмент для перечисления всех @Native
аннотаций).