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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы декомпиляции 
:(
    Опции темы
Atum
Дата 20.8.2012, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вопрос возник такой : 

в классе есть поле -  public final static String OAuthConsumerKey = "key26";

 при этом при создании оно используется setter 

Код

        public static  ConfigurationBuilder getConfigurationBuilder(){
        ConfigurationBuilder  cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true)
                .setOAuthConsumerKey(OAuthConsumerKey);
        return cb;
    }


что заметил : после компиляции (произвел де компиляцию класса  ) и увидел что значение строено в код 

Код

        public static  ConfigurationBuilder getConfigurationBuilder(){
        ConfigurationBuilder  cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true)
                .setOAuthConsumerKey("key26");
        return cb;
    }



 теперь как бы мы не изменяли значение - OAuthConsumerKey  - в коде оно всегда будет равно старому значению ... т.е. засело там навсегда ...

Как с таким бороться ? 

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


как бороться со статик полями ?

PM MAIL   Вверх
AntonSaburov
Дата 22.8.2012, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



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

Теперь по сути вопроса - прблема в оптимизации компилятора. Он сам заменяет константы в коде. Так что декомпилятор выдает уже результат декомпиляции оптимизированного кода. И честно не понятно, что имелось с виду под "как с этим бороться". Обычно люди код декомпилируют не для того, чтобы его снова править.
Может можно выставить какие-то параметра декомпилятора. Или запускать рефакторинг.
PM MAIL WWW ICQ   Вверх
Atum
Дата 3.9.2012, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема в том что после пересбоки jsp  страницы (аналогично с  jar  арихивом) - и выкладки его на сервер - значение в сервере остается старое - т.е "key26" ,в скомпиллиных классах он считает что значение не изменилось - раз оно было задано как final static  .

(Замечено на томкате, резине и гласфише).

поэтому приходится удалять из серверных папок скомпиленые им классы руками .

Это сообщение отредактировал(а) Atum - 3.9.2012, 11:50
PM MAIL   Вверх
math64
Дата 3.9.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Убери final - оптимизации не будет.
PM   Вверх
rang3r
Дата 7.9.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Atum @  20.8.2012,  17:16 Найти цитируемый пост)
Как с таким бороться ? 

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


как бороться со статик полями ?


при объявлении public static final String полей используй метод String#intern().
Ex:
Код

public static final String someString = "some string".intern();

Тогда строка не будет инлайниться, будет браться экземпляр из кэша, либо если его нет, то он создаться и поместиться туда.

Это сообщение отредактировал(а) rang3r - 7.9.2012, 15:39
PM MAIL Skype   Вверх
Atum
Дата 25.11.2012, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(rang3r @ 7.9.2012,  15:38)

при объявлении public static final String полей используй метод String#intern().
Ex:
Код

public static final String someString = "some string".intern();

Тогда строка не будет инлайниться, будет браться экземпляр из кэша, либо если его нет, то он создаться и поместиться туда.

!!!Спасибо ! сам до этого тогда не дошел ! это как раз то решение которое я и искал! 

еще раз спасибо . действительно либо intern()

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

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

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


 




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


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

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