![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Уважаемые форумчане, такой вопрос,
Озаботился назначением переменной class: зачем нужна, какого она типа, где находится (в классе Object ее нет, в других - тоже не видел) и вообще, что она делает? Очень был бы рад простому и доходчивому разъяснению этого вопроса. Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Нет такой переменной. Запись:
это просто указание компилятору, что надо взять Class объект описывающий класс SomeClass. Никакой переменной нет. P.S. Попробуй
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
||||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
т. е. это что-то вроде Class.forName("SomeClass")? Да, я написал System.out.println(int.class); - получилось int. А если написать Class.forName("int"); - получается ошибка ClassNotFoundException. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
а документацию почитать по "Class", "Class.forName(...)" не судьба?
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Компилируется в байт-код именно так, но для классов, но не для int. Поэтому если пропустить jar через обфускатор, который переименует SomeClass в a, код работать не будет. Такой код выдержит прогон через обфускатор:
|
|||
|
||||
| Pawl |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
спасибо за информацию. Хочу еще уточнить: при вызове метода Class.forName("SomeClass") (документацию по которому я, кстати, читал), возвращается объект класса Class для класса SomeClass, и при этом происходит инициализация статической части SomeClass. Действительно, если я напишу
то этот код при запуске выдаст
Но если сделать так
то в результате будет просто
Т. е. получается, что SomeClass.class - это не тоже самое, что Class.forName("SomeClass"). Значит ли это, что в первом случае просто создается объект класса Class для SomeClass, без инициализации статической части SomeClass? -------------------- В действительности всё совсем не так, как на самом деле |
||||||||
|
|||||||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Объект не создаётся в любом случае, а только загружается байт-код класса.
Но в первом случае выполняются статичесткая инициализация. То что SomeClass.class транслируется как Class.forName("SomeClass") я проверял в JDK, в котором не было шаблонных функций. В новых JDK видимо транслируется по-другому, заметь: у тебя Class<Abs> c = Abs.class; а не Class c = Abs.class; Добавлено через 6 минут и 59 секунд Вот как транслируется твой пример (javap -c Iniz):
|
|||
|
||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Вот пул констант:
Добавлено через 5 минут и 19 секунд но класс всё-таки грузится: если удалить Abs.class получишь
|
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Класс для примитивного типа, так не загрузишь. Там есть специальный метод Class.getPrimitiveClass(), но он приватный для java.lang. В Class.forName() можно указать, что не надо вызывать инициализацию класса. Эффект будет тот же самый. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Pawl |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо, math64, но всё-же...
А как же тогда понимать описание метода forName в JDK-docs?
разве Returns the Class object не переводится, как "возвращает объект класса"? если написать Class c = Abs.class; результат останется прежним. В JDK-docs про NoClassDefFoundError написано:
Интересно, что тут значит "definition of the class" (определение класса)? Добавлено через 5 минут и 33 секунды
согласен, написал Class c = Class.forName("Abs", false, null); получил ClassNotFoundException! -------------------- В действительности всё совсем не так, как на самом деле |
||||||
|
|||||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Я говорил про случай, когда класс загружается, но не инициализируется, как в случае:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Возвращает объект типа Class, ассоциированный с классом или интерфейсом с заданным строкой name именем. Я имет ввиду, что не создаётся объект класса, заданого строкой name (объект абстрактного класса или интерфейса, понятно, не может быть создан в любом случае). Кстати, объект типа Class создаётся только при первом вызове - в дальнейшем код эквивалентен загрузке константы (см. байт-код) NoClassDefFoundError получишь если файл Abs.class удалён или попорчен - ClassLoader не сможет его загрузить или найти в нём определение класса. |
|||
|
||||
| Pawl |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Всем Спасибо, теперь стало более понятно!
Понял, когда я написал вот так
Получился такой же вывод, как в коде
-------------------- В действительности всё совсем не так, как на самом деле |
||||||
|
|||||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Смысла в таком коде особого нет - ты два раза получаешь объект Class для класса Abs двуми способами - сначала через Abs.class, затем через Class.forName(). В случае, когда текущий класс и класс Abs имеют тот же загрузщик (в обычной ситуации это так), можно так:
Это сообщение отредактировал(а) math64 - 18.10.2011, 08:04 |
||||||
|
|||||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо! только предыдущие коды у меня работали сразу в методе main, поэтому я написал такую вот тавтологию -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |