Почему MIN_VALUE и MAX_VALUE в целочисленном классе определены @native?

#java

#java

Вопрос:

Я просматривал код целочисленного класса и заметил, что MIN_VALUE и MAX_VALUE помечены @native . Мой вопрос

  1. Какова цель использования @native аннотации?

  2. Где мы можем найти машинный код, который используется @native ?

  3. Есть ли какой-либо вариант использования, в котором мы должны использовать @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:

  1. В основном это предназначено для автоматической генерации собственного кода. Таким образом, такие константы могут быть легко использованы машинным кодом.

  2. И наоборот: машинный код может использовать такую константу.

  3. Если вы имеете в виду normal==Java, то ответ отрицательный.

Комментарии:

1. «автоматическая генерация собственного кода» — вы имеете в виду JIT? Разве это не то, что делает JIT, генерирует машинный код для более быстрого выполнения? Итак, вы, должно быть, имеете в виду JIT, верно? — Нееет…. Возможно, вы имеете в виду JNI…. Да…. Может быть? Было бы неплохо уточнить.

2. @Andreas Нет, это не относится к JIT. Это также не относится к JNI, не совсем так. Любой инструмент, который может генерировать машинный код, может использовать эти аннотации в качестве подсказок. Не указано, какие это могут быть инструменты. Существует множество инструментов, которые генерируют склеивающий код / машинный код, некоторые из них могут использовать JNI, некоторые JNA.

Ответ №2:

Java 8 javadoc включает в себя следующие предложения:

«Указывает, что на поле, определяющее постоянное значение, можно ссылаться из собственного кода. Аннотация может использоваться в качестве подсказки инструментами, которые генерируют собственные заголовочные файлы, чтобы определить, требуется ли файл заголовка, и если да, то какие объявления он должен содержать. «

Итак:

  1. Какова цель использования @native аннотации?

Смотрите выше.

  1. Где мы можем найти машинный код, который используется @native ?

Сгенерированные заголовочные файлы и любые ссылки на собственный код на вышеуказанные символы ( MIN_VALUE и MAX_VALUE ) будут находиться в дереве исходных текстов OpenJDK Java. (Обычно я отслеживаю ссылки на символы в исходном дереве, используя комбинацию find , xargs и grep , но, вероятно, есть способы получше.)

  1. Есть ли какой-либо вариант использования, в котором мы должны использовать @native аннотацию в обычном программировании?

Одним из случаев может быть, если вы реализуете свои собственные API, которые включают собственный код и сгенерированные собственные заголовочные файлы.

Но если вы имеете в виду варианты использования в (чистом виде) Код Java, я не могу придумать ни одного 1.

1 — Помимо уже отмеченных (например, JNI и т. Д. Собственные генераторы заголовков) И бессмысленных (например, инструмент для перечисления всех @Native аннотаций).