Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу откомпилировать 
:(
    Опции темы
quadroman
Дата 3.8.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.8.2006

Репутация: нет
Всего: нет



Люди добрые (и не только) помогите бедному юзеру. Приспичило мне кое-че поменять в файле блаблабла.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

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  LoginController.zip 9,40 Kb
PM MAIL   Вверх
LSD
Дата 3.8.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(quadroman @  3.8.2006,  14:29 Найти цитируемый пост)
Что это все может означать кроме того что я нуб и чайник в Java?
DJdecompiler не может блаблабла.class правильно и полностью раскомпилить, или код кривой(в чем я сильно сомневаюсь, так как взят он из рабочей проги)?

Не смог декомпилировать, причины могут быть различными.


Цитата(quadroman @  3.8.2006,  14:29 Найти цитируемый пост)
Мне всего то надо было поменять строку
public SessionKey(int playOK1, int loginOK2, int loginOK1, int playOK2)
на
public SessionKey(int loginOK1, int loginOK2, int playOK1, int playOK2)

Эти строки полностью идентичны, важны только типы параметров и их порядок, а не то как они называются.

И еще вопрос, зачем тебе понадобилось декомпилировать классы, и почему у тебя нет исходников?


--------------------
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.
PM MAIL WWW   Вверх
quadroman
Дата 3.8.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.8.2006

Репутация: нет
Всего: нет



Это один из файлов сервера 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 не приветствуется, но все же есть ли способ обойти это ограничение?

Это сообщение отредактировал(а) quadroman - 3.8.2006, 16:21
PM MAIL   Вверх
powerOn
Дата 3.8.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(quadroman @  3.8.2006,  17:13 Найти цитируемый пост)
К счастью я не настолько умен чтобы пытаться заменить строку на идентичную ей)) Я просто ошибся. Дело именно в порядке, надо поменять 
public SessionKey(int playOK1, int loginOK2, int loginOK1, int playOK2)
на
public SessionKey(int loginOK1, int loginOK2, int playOK1, int playOK2),
это позволит мне подконнектиться своим старым клиентом к новому серверу.

Это идентичные строки.


Цитата(quadroman @  3.8.2006,  17:13 Найти цитируемый пост)
что за ошибка например
JVM INSTR monitorenter; ?
                 ^
хотя JVM установлена (как я понимаю она входит в состав jre).

Декомпилятор не всегда дает код Java который можно в последствии скомпилировать. В этом не ничего удивительного.


Цитата(quadroman @  3.8.2006,  17:13 Найти цитируемый пост)
И еще почему компилятор ругается на goto. Ведь исходники все-таки как-то компилировали. Я знаю что goto не приветствуется, но все же есть ли способ обойти это ограничение? 

goto хоть и зарезервированное слово, но его использование запрещено. Вероятно поэтому и зарезервированно.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 3.8.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(quadroman @  3.8.2006,  17:13 Найти цитируемый пост)
Но все же меня интересует, что за ошибка например
JVM INSTR monitorenter; ?
                 ^
хотя JVM установлена (как я понимаю она входит в состав jre).
И еще почему компилятор ругается на goto. Ведь исходники все-таки как-то компилировали. Я знаю что goto не приветствуется, но все же есть ли способ обойти это ограничение?

Это не код Java. Когда декомпилятор не смог декомпилировать код, он просто оставил все как есть, а именно он оставил байткод, в виде некой разновидности Java-ассемблера. monitorentergoto - это не операторы Java, это инструкции виртуальной Java машины.

Тут или надо сидеть и вручную на основе байткода восстанавливать исходник. Или переписать байткод, единственного метода. И то, и другое, задачи нетривиальные.

А почему ты вообще, решил что проблема в этом месте, учитывая что в Java ты не разбираешься и вообще даже кода не видел?


--------------------
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.
PM MAIL WWW   Вверх
quadroman
Дата 3.8.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.8.2006

Репутация: нет
Всего: нет



Сервер при попытке подключения моего клиента(с более старым протоколом, чем в сервере) пишет SessionKey is incorrect, closing connection.
На форуме сервера многие сталкивались с такой же проблемой, и ее решение - заставить сервер использовать более старый SessionKey, поменяв соответствующую строку.
Я не разбираюсь в Java, но это не значит что я не разбираюсь в C/C++ или в Delphi)).
Как это я не видел кода? Декомпилятор показал именно код, а не байткод. Сначала я попробовал jad, он не смог полностью декомпилировать этот файл, выдав сообщение об ошибке.
Зато DJdecompiler без проблем открыл .class, при этом никаких ошибок не было. Мне это показалось странным, так как он основан на том же движке jad. Но раз не было сообщений об ошибках, я сделал вывод что декомпиляция прошла успешно.
PM MAIL   Вверх
allex
Дата 3.8.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 5.9.2005

Репутация: нет
Всего: нет



quadroman, исходники этого файла вообще-то свободно доступны судя по имени пакета.
http://l2j.cvs.sourceforge.net/l2j/L2_Game...r.java?view=log
Но я хоть убей там не вижу такого - какая версия-то хоть? Ну или дата сборки примерная?

Другой выход - попытаться использовать дизассемблер, а не декомпилятор. Дизассемблер нужен такой, который выдает код в формате jasmin - Java ассемблер. У меня валяется jasper, но он не справился - судя по всему, не понимает новых фич языка. Другой дизассемблер искать лень. Проще найти исходник.

LSD
Цитата
Эти строки полностью идентичны, важны только типы параметров и их порядок, а не то как они называются.

Неправда ваша, батенька. Это сигнатура неабстрактного метода, параметры внутри метода используются.

Добавлено @ 17:22 
quadroman, во, я понял, как должно получиться: Открывай jad-ом только файл LoginController$SessionKey. Убирай модификатор static у class. И правь сигнатуру. После чего компилируй.

Если бы я не тупил и понял, как приложить файл - я бы это сделал smile Во, сумел. Только в имени файла доллар, а не подчерк.



Это сообщение отредактировал(а) allex - 3.8.2006, 17:25

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  LoginController_SessionKey.java 1,36 Kb
PM MAIL   Вверх
powerOn
Дата 3.8.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(allex @  3.8.2006,  18:13 Найти цитируемый пост)
Неправда ваша, батенька. Это сигнатура неабстрактного метода, параметры внутри метода используются.


А можно здесь поподробнее? Просто я не очень понял, как имя переменной влияет на сигнатуру неабстрактного метода да и любого друго тоже.... 


Это сообщение отредактировал(а) MoonCat - 3.8.2006, 18:30


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
quadroman
Дата 3.8.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.8.2006

Репутация: нет
Всего: нет



Дата сборки:
====================
L2J Server 
====================
$Date: 2006/12/06 19:14:22 $
качал 2 недели назад, но они похоже нечасто готовую сборку апдейтят. Эта ссылка на старые версии сервера, кстати к новым исходникам доступ есть только у разработчиков((

Код


// Source File Name:   LoginController.java
package net.sf.l2j.loginserver;
import net.sf.l2j.Config;
// Referenced classes of package net.sf.l2j.loginserver:
//            LoginController

public class LoginController$SessionKey
{

    public String toString()
    {
        return (new StringBuilder()).append("PlayOk: ").append(playOkID1).append(" ").append(playOkID2).append(" LoginOk:").append(loginOkID1).append(" ").append(loginOkID2).toString();
    }

    public boolean equals(LoginController$SessionKey key)
    {
        if(Config.SHOW_LICENCE)
            return playOkID1 == key.playOkID1 && loginOkID1 == key.loginOkID1 && playOkID2 == key.playOkID2 && loginOkID2 == key.loginOkID2;
        else
            return playOkID1 == key.playOkID1 && playOkID2 == key.playOkID2;
    }

    public int playOkID1;
    public int playOkID2;
    public int loginOkID1;
    public int loginOkID2;

    public LoginController$SessionKey(int loginOK1, int loginOK2, int playOK1, int playOK2)
    {
        playOkID1 = playOK1;
        playOkID2 = playOK2;
        loginOkID1 = loginOK1;
        loginOkID2 = loginOK2;
    }
}


Так должно получиться?
Все бы было хорошо если бы мой компилятор все это откомпилил((

Это сообщение отредактировал(а) MoonCat - 3.8.2006, 18:49
PM MAIL   Вверх
powerOn
Дата 3.8.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Модератор: quadroman, используйте кнопку КОД для оформления Java кода.

Скорее всего нет. Мне кажется, что когда декомпилятор выводил имя класса ввиде: LoginController$SessionKey, то имелось ввиду, что класс LoginController имеет  внутренний класс SessionKey. Что-то типа того:

Код

class LoginController {

class SessionKey {

}

}



Это сообщение отредактировал(а) MoonCat - 3.8.2006, 18:48


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 4.8.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(allex @  3.8.2006,  18:13 Найти цитируемый пост)
Неправда ваша, батенька. Это сигнатура неабстрактного метода, параметры внутри метода используются.

Ключевое слово используются. Сами сигнатуры методов полностью идентичны (сигнатура определяется только типами параметров и их порядком следования), но не именем формального параметра. Информация об именах формальных параметров сохраняется в class-файле (по крайней мере когда он скомпилирован с отладочной информацией), но смысла их менять нет.
Ему нужно изменить не саму сигнатуру, а метод, хотя для этого и достаточно немного подправить объявление метода.

А вообще на SourceForge.net есть анонимный доступ к CVS (только для чтения, правда, но этого достаточно). Можно утянуть исходник этого класса нужной версии.


--------------------
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.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0909 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.