Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Не могу откомпилировать |
Автор: quadroman 3.8.2006, 13:29 |
Люди добрые (и не только) помогите бедному юзеру. Приспичило мне кое-че поменять в файле блаблабла.class. С Java раньше не сталкивался, поэтому скачал первое что нашел - DJdecompiler. Открыл я этот файл, пару строк заменил, сохранил под именем блаблабла.java. Он зараза не компилится,при этом DJdecompiler выдает следующее: C:\my\LOGINC~1\LoginController.java:261: ';' expected GameServerThread gs; ^ C:\my\LOGINC~1\LoginController.java:267: illegal start of expression goto _L1 ^ C:\my\LOGINC~1\LoginController.java:269: ';' expected JVM INSTR monitorexit ; ^ C:\my\LOGINC~1\LoginController.java:270: illegal start of expression goto _L2 ^ C:\my\LOGINC~1\LoginController.java:272: not a statement exception; ^ C:\my\LOGINC~1\LoginController.java:282: ';' expected JVM INSTR monitorenter ; ^ C:\my\LOGINC~1\LoginController.java:285: not a statement GameServerThread gs; ^ C:\my\LOGINC~1\LoginController.java:285: ';' expected GameServerThread gs; ^ C:\my\LOGINC~1\LoginController.java:291: illegal start of expression goto _L1 ^ C:\my\LOGINC~1\LoginController.java:293: ';' expected JVM INSTR monitorexit ; ^ C:\my\LOGINC~1\LoginController.java:294: illegal start of expression goto _L2 ^ C:\my\LOGINC~1\LoginController.java:296: not a statement exception; ^ C:\my\LOGINC~1\LoginController.java:344: not a statement e; ^ ... ... ... 39 errors А еще когда я .class открываю DJdecompiler'ом там несколько раз встречается: break MISSING_BLOCK_LABEL_61; и break MISSING_BLOCK_LABEL_169; (549,506,493,167, и т.д.) Что это все может означать кроме того что я нуб и чайник в Java? DJdecompiler не может блаблабла.class правильно и полностью раскомпилить, или код кривой(в чем я сильно сомневаюсь, так как взят он из рабочей проги)? Насчет классов... так я все JARы что были в папке с прогой прописал. Мне всего то надо было поменять строку public SessionKey(int playOK1, int loginOK2, int loginOK1, int playOK2) на public SessionKey(int loginOK1, int loginOK2, int playOK1, int playOK2) (( P.S. SDK и JRE 1.5.0, DJ Java Decompiler версии 3.7 |
Автор: quadroman 3.8.2006, 16:13 |
Это один из файлов сервера MMORPG игры LineageII, написанного на Java. Распространяется бесплатно, на условиях помощи и поддержки проекта. Если это одно и то же, то почему очень многим это помогло? Скорее всего ты просто не видел сам файл LoginController.class. Дело именно в порядке, надо поменять public SessionKey(int playOK1, int loginOK2, int loginOK1, int playOK2) на public SessionKey(int loginOK1, int loginOK2, int playOK1, int playOK2) Это позволит мне подконнектиться своим старым клиентом к новому серверу. Конечно можно обновить клиент игры, но качать пару сотен мегов через GPRS как то не вдохновляет, тем более что достаточно только поменять одну строку в одном файле и все будет норм. Если бы кто-нибудь сделал это в присоединенном файле, я был бы очень благодарен. Но все же меня интересует, что за ошибка например JVM INSTR monitorenter; ? ^ хотя JVM установлена (как я понимаю она входит в состав jre). И еще почему компилятор ругается на goto. Ведь исходники все-таки как-то компилировали. Я знаю что goto не приветствуется, но все же есть ли способ обойти это ограничение? |
Автор: powerOn 3.8.2006, 16:21 | ||||||
Это идентичные строки.
Декомпилятор не всегда дает код Java который можно в последствии скомпилировать. В этом не ничего удивительного.
goto хоть и зарезервированное слово, но его использование запрещено. Вероятно поэтому и зарезервированно. |
Автор: LSD 3.8.2006, 16:34 | ||
Это не код Java. Когда декомпилятор не смог декомпилировать код, он просто оставил все как есть, а именно он оставил байткод, в виде некой разновидности Java-ассемблера. monitorenter, goto - это не операторы Java, это инструкции виртуальной Java машины. Тут или надо сидеть и вручную на основе байткода восстанавливать исходник. Или переписать байткод, единственного метода. И то, и другое, задачи нетривиальные. А почему ты вообще, решил что проблема в этом месте, учитывая что в Java ты не разбираешься и вообще даже кода не видел? |
Автор: quadroman 3.8.2006, 17:01 |
Сервер при попытке подключения моего клиента(с более старым протоколом, чем в сервере) пишет SessionKey is incorrect, closing connection. На форуме сервера многие сталкивались с такой же проблемой, и ее решение - заставить сервер использовать более старый SessionKey, поменяв соответствующую строку. Я не разбираюсь в Java, но это не значит что я не разбираюсь в C/C++ или в Delphi)). Как это я не видел кода? Декомпилятор показал именно код, а не байткод. Сначала я попробовал jad, он не смог полностью декомпилировать этот файл, выдав сообщение об ошибке. Зато DJdecompiler без проблем открыл .class, при этом никаких ошибок не было. Мне это показалось странным, так как он основан на том же движке jad. Но раз не было сообщений об ошибках, я сделал вывод что декомпиляция прошла успешно. |
Автор: allex 3.8.2006, 17:13 | ||
quadroman, исходники этого файла вообще-то свободно доступны судя по имени пакета. http://l2j.cvs.sourceforge.net/l2j/L2_Gameserver/java/net/sf/l2j/loginserver/LoginController.java?view=log Но я хоть убей там не вижу такого - какая версия-то хоть? Ну или дата сборки примерная? Другой выход - попытаться использовать дизассемблер, а не декомпилятор. Дизассемблер нужен такой, который выдает код в формате jasmin - Java ассемблер. У меня валяется jasper, но он не справился - судя по всему, не понимает новых фич языка. Другой дизассемблер искать лень. Проще найти исходник. LSD,
Неправда ваша, батенька. Это сигнатура неабстрактного метода, параметры внутри метода используются. Добавлено @ 17:22 quadroman, во, я понял, как должно получиться: Открывай jad-ом только файл LoginController$SessionKey. Убирай модификатор static у class. И правь сигнатуру. После чего компилируй. Если бы я не тупил и понял, как приложить файл - я бы это сделал ![]() |
Автор: powerOn 3.8.2006, 18:29 | ||
А можно здесь поподробнее? Просто я не очень понял, как имя переменной влияет на сигнатуру неабстрактного метода да и любого друго тоже.... |
Автор: quadroman 3.8.2006, 18:41 | ||
Дата сборки: ==================== L2J Server ==================== $Date: 2006/12/06 19:14:22 $ качал 2 недели назад, но они похоже нечасто готовую сборку апдейтят. Эта ссылка на старые версии сервера, кстати к новым исходникам доступ есть только у разработчиков((
Так должно получиться? Все бы было хорошо если бы мой компилятор все это откомпилил(( |
Автор: powerOn 3.8.2006, 18:48 | ||
Модератор: quadroman, используйте кнопку КОД для оформления Java кода. Скорее всего нет. Мне кажется, что когда декомпилятор выводил имя класса ввиде: LoginController$SessionKey, то имелось ввиду, что класс LoginController имеет внутренний класс SessionKey. Что-то типа того:
|
Автор: LSD 4.8.2006, 10:29 | ||
Ключевое слово используются. Сами сигнатуры методов полностью идентичны (сигнатура определяется только типами параметров и их порядком следования), но не именем формального параметра. Информация об именах формальных параметров сохраняется в class-файле (по крайней мере когда он скомпилирован с отладочной информацией), но смысла их менять нет. Ему нужно изменить не саму сигнатуру, а метод, хотя для этого и достаточно немного подправить объявление метода. А вообще на SourceForge.net есть анонимный доступ к CVS (только для чтения, правда, но этого достаточно). Можно утянуть исходник этого класса нужной версии. |