| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > переменная class |
| Автор: Pawl 14.10.2011, 18:22 |
| Уважаемые форумчане, такой вопрос, Озаботился назначением переменной class: зачем нужна, какого она типа, где находится (в классе Object ее нет, в других - тоже не видел) и вообще, что она делает? Очень был бы рад простому и доходчивому разъяснению этого вопроса. Спасибо! |
| Автор: LSD 14.10.2011, 18:48 | ||||
Нет такой переменной. Запись:
это просто указание компилятору, что надо взять Class объект описывающий класс SomeClass. Никакой переменной нет. P.S. Попробуй
|
| Автор: Samotnik 14.10.2011, 22:14 |
| быть может речь о http://en.wikipedia.org/wiki/Classpath_%28Java%29 ? |
| Автор: dorogoyIV 15.10.2011, 14:02 |
| а документацию почитать по "Class", "Class.forName(...)" не судьба? |
| Автор: math64 15.10.2011, 20:16 | ||
Компилируется в байт-код именно так, но для классов, но не для int. Поэтому если пропустить jar через обфускатор, который переименует SomeClass в a, код работать не будет. Такой код выдержит прогон через обфускатор:
|
| Автор: Pawl 16.10.2011, 11:49 | ||||||||
спасибо за информацию. Хочу еще уточнить: при вызове метода Class.forName("SomeClass") (документацию по которому я, кстати, читал), возвращается объект класса Class для класса SomeClass, и при этом происходит инициализация статической части SomeClass. Действительно, если я напишу
то этот код при запуске выдаст
Но если сделать так
то в результате будет просто
Т. е. получается, что SomeClass.class - это не тоже самое, что Class.forName("SomeClass"). Значит ли это, что в первом случае просто создается объект класса Class для SomeClass, без инициализации статической части SomeClass? |
| Автор: math64 16.10.2011, 13:43 | ||
| Объект не создаётся в любом случае, а только загружается байт-код класса. Но в первом случае выполняются статичесткая инициализация. То что SomeClass.class транслируется как Class.forName("SomeClass") я проверял в JDK, в котором не было шаблонных функций. В новых JDK видимо транслируется по-другому, заметь: у тебя Class<Abs> c = Abs.class; а не Class c = Abs.class; Добавлено через 6 минут и 59 секунд Вот как транслируется твой пример (javap -c Iniz):
|
| Автор: math64 16.10.2011, 14:01 | ||||
Вот пул констант:
Добавлено через 5 минут и 19 секунд но класс всё-таки грузится: если удалить Abs.class получишь
|
| Автор: LSD 17.10.2011, 10:10 | ||
Класс для примитивного типа, так не загрузишь. Там есть специальный метод Class.getPrimitiveClass(), но он приватный для java.lang. В Class.forName() можно указать, что не надо вызывать инициализацию класса. Эффект будет тот же самый. |
| Автор: Pawl 17.10.2011, 10:11 | ||||||
| Спасибо, 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 17.10.2011, 10:22 | ||||
Я говорил про случай, когда класс загружается, но не инициализируется, как в случае:
|
| Автор: math64 17.10.2011, 13:23 | ||||
Возвращает объект типа Class, ассоциированный с классом или интерфейсом с заданным строкой name именем. Я имет ввиду, что не создаётся объект класса, заданого строкой name (объект абстрактного класса или интерфейса, понятно, не может быть создан в любом случае). Кстати, объект типа Class создаётся только при первом вызове - в дальнейшем код эквивалентен загрузке константы (см. байт-код) NoClassDefFoundError получишь если файл Abs.class удалён или попорчен - ClassLoader не сможет его загрузить или найти в нём определение класса. |
| Автор: Pawl 17.10.2011, 20:36 | ||||||
Всем Спасибо, теперь стало более понятно!
Понял, когда я написал вот так
Получился такой же вывод, как в коде
|
| Автор: math64 18.10.2011, 08:02 | ||||||
Смысла в таком коде особого нет - ты два раза получаешь объект Class для класса Abs двуми способами - сначала через Abs.class, затем через Class.forName(). В случае, когда текущий класс и класс Abs имеют тот же загрузщик (в обычной ситуации это так), можно так:
|
| Автор: Pawl 18.10.2011, 08:17 | ||
Спасибо! только предыдущие коды у меня работали сразу в методе main, поэтому я написал такую вот тавтологию |