Прославленные классы на языке Java

Некоторые классы в стандартном Java API рассматриваются немного иначе, чем другие классы. Я говорю о тех классах, которые не могут быть реализованы без специальной поддержки от компилятора и/или JVM.

Те, с которыми я пришел сразу, следующие:

  • Object (очевидно), поскольку он, помимо прочего, не имеет суперкласса.
  • String, поскольку язык имеет специальную поддержку для оператора +.
  • Thread, так как он имеет этот магический метод start(), несмотря на то, что нет инструкции по байт-коду, которая "виляет" выполнение.

Я полагаю, что все классы, подобные этим, так или иначе упоминаются в JLS. Исправьте меня, если я ошибаюсь.

В любом случае, какие существуют другие подобные классы? Есть ли полный список "прославленных классов" на языке Java?

Ответ 1

Есть много разных ответов, поэтому я подумал, что было бы полезно собрать их все (и добавить некоторые):

Классы

  • классы AutoBoxing - компилятор разрешает только определенные классы
  • Класс - имеет свои собственные литералы (например, int.class). Я бы также добавил его типичную типизацию без создания новых экземпляров.
  • Строка - с ней перегружен + -оператор и поддержка литералов
  • Enum - единственный класс, который может использоваться в операторе switch (вскоре также будет предоставлена ​​привилегия для String). Он также выполняет другие функции (автоматическое создание статических методов, обработка сериализации и т.д.), Но теоретически они могут быть выполнены с помощью кода - это всего лишь много шаблонов, и некоторые из ограничений не могут быть применены в подклассах (например, специальные правила подклассов), но то, что вы никогда не смогли бы выполнить без привилегированного статуса перечисления, включает его в оператор switch.
  • Объект - корень всех объектов (и я бы добавил, что его методы клонирования и финализации не могут быть реализованы)
  • Ссылки: WeakReference, SoftReference, PhantomReference
  • Тема - язык не дает вам конкретной инструкции для запуска потока, скорее он магически применяет его к методу start().
  • Throwable - корень всех классов, которые могут работать с throw, throws и catch, а также понимание компилятором Exception vs. RuntimeException и Error.
  • NullPointerException и другие исключения, такие как ArrayIndexOutOfBounds, которые могут быть выбраны другими инструкциями байткода, чем athrow.

Интерфейсы

  • Iterable - единственный интерфейс, который может использоваться в расширенном цикле

Почетные упоминания относятся к:

  • java.lang.reflect. Array - создание нового массива, как определено объектом класса, не представляется возможным.
  • Аннотации. Это специальная языковая функция, которая ведет себя как интерфейс во время выполнения. Вы определенно не могли определить другой интерфейс Annotation, так же как вы не можете определить замену для Object. Однако вы могли бы реализовать всю свою функциональность и просто иметь другой способ получить их (и целую кучу шаблона), а не отражать. Фактически, перед введением аннотаций было множество реализаций на основе XML и javadoc.
  • ClassLoader - он, безусловно, имеет привилегированные отношения с JVM, так как нет никакого языкового способа загрузки класса, хотя есть способ байт-кода, поэтому он аналогичен Array. Он также имеет особую привилегию быть вызванным JVM, хотя это деталь реализации.
  • Serializable - вы можете реализовать функциональность через отражение, но у нее есть собственное привилегированное ключевое слово, и вы потратили бы много времени на то, чтобы сблизиться с SecurityManager в некоторых сценариях.

Примечание. Я не использовал список, который предоставляет JNI (например, IO), потому что вы всегда можете реализовать свой собственный JNI-вызов, если бы вы были так склонны. Однако нативные вызовы, которые взаимодействуют с JVM в привилегированном режиме, различны.

Массивы являются спорными - они наследуют Object, имеют понятную иерархию (Object [] является супертипом String []), но они являются языковой функцией, а не определенным классом.

Ответ 2

Class, конечно. У этого есть свои собственные литералы (различие, которое он разделяет с String, BTW) и является отправной точкой всей этой магии отражения.

Ответ 3

sun.misc.unsafe является матерью всех грязных, взломанных духом хакеров.

Ответ 4

  • Enum. Вы не можете подклассифицировать его, но компилятор может.
  • Многие вещи под java.util.concurrent могут быть реализованы без поддержки JVM, но они будут намного менее эффективными.

Ответ 6

Поскольку упоминались важные классы, я упомянул некоторые интерфейсы:

Интерфейс Iterable (начиная с 1,5) - позволяет объекту участвовать в цикле foreach:

Iterable<Foo> iterable = ...;
for (Foo foo : iterable) {

}

Интерфейс Serializable имеет особое значение, отличное от стандартного интерфейса. Вы можете определить методы, которые будут приняты во внимание, даже если они не определены в интерфейсе (например, readResolve()). Ключевое слово transient - это элемент языка, который влияет на поведение конструкторов Serializable.

Ответ 7

  • Throwable, исключение RuntimeException, ошибка AssertionError
  • Ссылки WeakReference, SoftReference, PhantomReference
  • Enum
  • Аннотация

Ответ 8

Java-массив, как в int[].class

Ответ 10

Не уверен в этом. Но я не могу придумать способ ручного ввода объектов IO.

Ответ 11

В классе System есть некоторая магия.

System.arraycopy - это привязка к собственному коду

public static native void arraycopy(Object array1, int start1, 
  Object array2, int start2, int length);

но...

/**
 * Private version of the arraycopy method used by the jit
 * for reference arraycopies
 */
private static void arraycopy(Object[] A1, int offset1,
  Object[] A2, int offset2, int length) {
   ...
}

Ответ 12

Хорошо, так как упоминалось специальное обращение с утверждением. Вот еще несколько типов исключений, которые имеют специальную обработку jvm:

  • NullPointerException
  • ArithmeticException.
  • StackOverflowException
  • Все виды OutOfMemoryErrors
  • ...

Исключения не являются особыми, но jvm использует их в особых случаях, поэтому вы не можете реализовать их самостоятельно, не создавая свой собственный jvm. Я уверен, что есть более специальные исключения.

Ответ 13

Большинство этих классов на самом деле не реализованы с помощью специальной помощи от компилятора или JVM. Объект регистрирует некоторых туземцев, которые ткнут вокруг внутренних структур JVM, но вы можете сделать это и для своих собственных классов. (Я допускаю, что это зависит от семантики, "вызывает нативный, определенный в JVM", можно рассматривать как специальную поддержку JVM.)

Что/is/special - это поведение команд "new" и "throw" в том, как они инициализируют эти внутренние структуры.

Аннотации и цифры в целом довольно странные, но.