![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
||
|
polosatij |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: 1 Всего: 8 |
1.4.2_01 да, я работаю с JBuilder он мне наиболее симпотичен ![]() я так же заметил, что код компилированный от JBuilder-а не может быть дизассемблированн sun-овским javap. может это только совпадение.. но уже 3 раза попадал на такой случай ![]() |
|||
|
||||
Domestic Cat |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
![]() ------------------------------------------------------------ Байткод для массивов, свитчей и иксепшнов В общем, это краткое изложение написанного в спецификации. Я написал один класс с 4 методами: созданием массивов, 2 метода со switch'ами и 1 с иксепшн хэндлингом:
Полный байткод с пулом я приводить не буду, помещу только куски для экономии места. 1. Массивы
Одномерный массив создается опкодом [a]newarray <type>, при этом на стеке должен лежать размер массива. (опкод anewarray созает массив объектов, newarray - массив примитивов) Многомерный массив создается так же, но инструкцией multi[a]newarray 2. switch Получаем вот что:
Свитчи с непрерывным диапазоном case'ов (0-1-2-деафулт) компилируются в tableswitch. В остальных случаях используется lookupswitch. Кстати, если значений всего два (например 1-2-дефаулт), будет использован lookupswitch. 3. Иксепшны
Код хорош тем, что после него начинаешь четко представлять, что такое finally ![]() Он превратился в строки 87-10, то есть он идет непосредственно за Thread.sleep(). Кроме того, он же стал строками 17-18, 26-27. finally на самом деле занял 6 байт, тогда как собственно код внутри него весит всего 2 байта! Первый catch стал строками 13-17, второй catch - 22-26. JVM добавила "перестраховочный" catch, ловящий иксепшны из первых двух кетчей и перебрасывающий возможный иксепшн. Бросание иксепшна сопровождается потерей фрейма и всего его содержимого. Это сообщение отредактировал(а) Domestic Cat - 1.12.2004, 05:18 -------------------- |
||||||||||
|
|||||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Чтобы иметь еще более четкое представление о том, как устроен class файл, полезно стянуть JCD дизасм (в аттачменте, для виндов), запустить его, и посмотреть любой класс файл. JCD дает более подробную информацию, чем javap -verbose, в частности, модификаторы полей и методов. Так, для предыдыщей программы получаем:
Это сообщение отредактировал(а) Domestic Cat - 1.12.2004, 05:39 Присоединённый файл ( Кол-во скачиваний: 18 ) ![]() -------------------- |
|||
|
||||
Domestic Cat |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Внутренние классы
1. Статик классы Посмотрим нa примерe кода:
Дизассемблировав, получим
и
чтобы дизассемблировать вnутренний класс через javap, набираем
Видно, что constant pool в InnerClass содержит ссылку нa статиk поle класса SimpleClass, благодаря чеmu внутренниe классы имеют доступ к (статик) переменныm внешнего классa. 2. Инстанс классы Если класс не статик (код я приводить не буду, он такой же, только без модифаеров "static") получим
Интересно тут то, что внутренний класс создается не через пустой (не принимающий аргументов) конструктор! Такого конструктора у него нет вообще. Зато есть конструктор InnerClass(SimpleClass), в который передается ссылка на инстанс класса SimpleClass, эта ссылка хранится в поле this$0. Если добавить в InnerClass конструктор, принимающий аргументы, например public InnerClass(int a), он превратится в <init>:(LSimpleClass;I)V; -------------------- |
||||||||||||
|
|||||||||||||
polosatij |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: 1 Всего: 8 |
еееееееех.. я всё никак не могу понять.. что обозначает пятая строчка.. что за единица после iconst? документация: Push int constant. а почему "1"? |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
![]() -------------------- |
|||
|
||||
Domestic Cat |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Локальные и анонимные классы
Эти классы компилируются точно так же, как и внутренние : они получают дополнительный аргумент в конструктор - ссылку на внешний класс, однако эта ссылка хранится как final. Для примера рассмотрим код:
Получаем 3 класс файла, из которых я приведу только байткод:
Это сообщение отредактировал(а) Domestic Cat - 2.12.2004, 05:30 -------------------- |
||||||||
|
|||||||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Java 1.5
Мне было интересно посмотреть ряд новых вещей, появившихся в Тигре, но к сожалению, ничего интересного тут нет (правда, это можно было предполагать, поскольку многое, те же новые циклы или автобоксинг, не несут ничего нового и просто сокращают работу программиста). Все "новые" конструкции компилируются в стандартный байткод. Возьмем маленький пример
Здесь 3 новых элемента - дженерикс(1), автобоксинг(2) и переменное количество аргументов, для краткости варарг, (3). Получается из них вот что:
Автобоксинг "разавтобоксивается" в обычный valueOf, так что выигрыша в длине байткода нет (хотя есть выигрыш в длине кода, мизерный).
Три точки превращаются в массив (трудно было догадаться) ![]() -------------------- |
||||||
|
|||||||
Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Я тоже так подумал что только компилятор усложнили, просто предоставили больше информации для отслеживания типов. Интересно изменился ли формат .class файла, если я создал шаблонную коллекцию и не имея исходников подключаю класс, должен же как то компилятор узнать какой тип я задал в шаблоне.
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Просто в constant pool добавляется запись обозначающая что класс шаблонный, типа
Все остальное остается прежним. -------------------- |
||||
|
|||||
Се ля ви |
|
|||
![]() Java/SOAрхитектор ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 8 Всего: 127 |
Вопрос в продолжение темы - примерные алгоритмы работы обфускатора и ингибитора (того же JAD`а).
И кстати, есть ли бесплатные защитники исходников Java? -------------------- |
|||
|
||||
seQira |
|
|||
Unregistered |
хорошая статья
|
|||
|
||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
В смысле, бесплатные обфускаторы? http://java-source.net/open-source/obfuscators
http://www-106.ibm.com/developerworks/java/library/j-obfus/ - хорошая статья
Спасибо -------------------- |
||||||
|
|||||||
polosatij |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: 1 Всего: 8 |
||||
|
||||
djGri |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 21.2.2005 Репутация: 1 Всего: 3 |
![]() Если объявить как private, то после декомпиляции получится package. Если объявить как protected, то после декомпиляции получится public. T.e: private, package -> package protected,public -> public Как узнать, что Inner classes был объявлен как private/protected ? ![]() BCEL тоже видит такие классы как написано выше. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |