Трудно сказать, как определенная JVM реализует экземпляр, но в большинстве случаев, Объекты сопоставимы со структурами, и классы также, и каждая объектная структура имеет указатель на структура класса, из которой это является экземпляр. Таким образом, на самом деле instanceof для
if (o instanceof java.lang.String)
мог бы быть с такой скоростью, как следующий код C
if (objectStruct->iAmInstanceOf == &java_lang_String_class)
предположение, что JIT-компилятор существует и делает достойное задание.
Рассмотрение, что это только получает доступ к указателю, получая указатель при определенном смещении указатель, указывает на и сравнивая это с другим указателем (который является в основном тем же как тестирующий к числам на 32 бита, являющимся равным), я сказал бы, что операция может на самом деле быть очень быстрой.
Это не имеет к, тем не менее, это во многом зависит от JVM. Однако, если бы это оказалось бы операцией узкого места в Вашем коде, я считал бы реализацию JVM довольно плохой. Даже тот, который не имеет никакого JIT-компилятора и только интерпретирует код, должен быть в состоянии сделать тест instanceof в фактически никакое время.
Поскольку они являются внутренними API-интерфейсами: они могут быть изменены недокументированным или неподдерживаемым способом, и они привязаны к определенному JRE / JDK ( Sun в вашем случае), ограничивая переносимость ваших программ.
Старайтесь избегать использования таких API, всегда предпочитайте публично задокументированный и указанный класс.
Документация JDK 6 включает ссылку под названием Примечание о sun. *
Пакеты . Это документ из документации Java 1.2, поэтому ссылки на sun. *
следует рассматривать так, как если бы они говорили com.sun. *
Наиболее важные моменты из него:
Классы, которые Sun включает в Java 2 SDK, Standard Edition, осень в группы пакетов
java. *
,javax. *
,org. *
иsun. *
. Все, кромесолнца. *
пакеты являются стандартной частью Платформа Java и будет поддерживаться в будущее. В общем, пакеты такие какsun. *
, которые находятся за пределами Платформа Java может отличаться в зависимости от Платформы ОС (Solaris, Windows, Linux, Macintosh и т. Д.) И можно поменять в любой момент. время без уведомления с версиями SDK (1.2, 1.2.1, 1.2.3 и т. Д.). Программ которые содержат прямые призывы ксолнцу. *
пакеты не являются 100% чистой Java.
и
Каждая компания, реализующая Java платформа сделает это самостоятельно частный путь. Классы в
sun. *
являются присутствует в SDK для поддержки Sun реализация платформы Java: классыsun. *
- вот что делает Классы платформы Java работают "под обложки »для Sun Java 2 SDK. Эти классов вообще не будет на платформе Java другого производителя. Если ваша программа Java запрашивает класс "sun.package.Foo" по имени, он может не работать с ClassNotFoundError, и вы потеряли главное преимущество разрабатывается на Java.
Попробуйте запустить свой код с JVM, отличной от Sun, и посмотрите, что произойдет ...
(Ваш код завершится ошибкой с исключением ClassNotFound)
Да, потому что никто не гарантирует, что эти классы или API будут такими же в следующем выпуске Java, и я уверен, что нет гарантии, что эти классы доступны в версиях Java от других поставщиков.
Таким образом, вы связываете свой код со специальной версией Java и теряете по крайней мере переносимость.
Собственные классы Java Sun являются частью их реализации Java, а не частью Java API, их использование недокументировано и не поддерживается. Поскольку они являются внутренними, их можно изменить в любое время по любой причине, которую решит команда, работающая с Sun JVM.
Кроме того, Java-реализация Sun не единственная из существующих! Ваш код нельзя будет переносить на JVM других поставщиков, таких как Oracle / BEA и IBM.
Недавно у меня был случай, который показал реальную проблему, с которой вы можете столкнуться при использовании этих классов: у нас был код, который не компилировался из-за метода, который он использовал в классе sun. * просто не существовало в OpenJDK на Ubuntu. Поэтому я полагаю, что при использовании этих классов вы больше не можете говорить что-то вроде «это работает с Java 5», потому что это будет работать только с определенной реализацией Java.