Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблемы декомпиляции


Автор: Atum 20.8.2012, 17:16
Вопрос возник такой : 

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


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

Автор: AntonSaburov 22.8.2012, 17:12
Не надо задавать вопросы с теме, которая создана для другого.

Теперь по сути вопроса - прблема в оптимизации компилятора. Он сам заменяет константы в коде. Так что декомпилятор выдает уже результат декомпиляции оптимизированного кода. И честно не понятно, что имелось с виду под "как с этим бороться". Обычно люди код декомпилируют не для того, чтобы его снова править.
Может можно выставить какие-то параметра декомпилятора. Или запускать рефакторинг.

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

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

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

Автор: math64 3.9.2012, 13:21
Убери final - оптимизации не будет.

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

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


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


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

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

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

Автор: Atum 25.11.2012, 19:18
Цитата(rang3r @ 7.9.2012,  15:38)

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

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

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

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

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

либо через getter

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)