Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Возможности рефлексии / 13 сообщений из 13, страница 1 из 1
15.03.2014, 01:01
    #38586989
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Всем привет!
Недавно открыл для себя рефлексию и узнал, что можно даже изменять значение поля private final static во время выполнения программы.
После этого возникла точка взгляда на поля класса, как на структуры со своими настройками, которые можно менять как хочется.
И стало очень интересно, а можно ли поменять модификатор поля (к примеру, с private в public), его тип (к примеру, с Integer в Double).
Я понимаю, что практически это нецелесообразно, потому что если сумел изменить значение поля, то на модификаторы уже плевать.
Но просто очень интересно, правильная ли эта точка зрения, что "поля класса, как структуры со своими настройками, которые можно менять как хочется" .
Да и если так можно сделать, покажите код, а то методов типо setModifier() нету(((
...
Рейтинг: 0 / 0
15.03.2014, 15:31
    #38587158
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01,
Паша01а можно ли поменять модификатор поля (к примеру, с private в public)
так точно можно
...
Рейтинг: 0 / 0
15.03.2014, 15:47
    #38587163
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Это да, тут же для изменения значения константы меняли модификатор.
Интересно, а что с типом делать, можно ли менять его?
...
Рейтинг: 0 / 0
15.03.2014, 15:47
    #38587164
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01И стало очень интересно, а можно ли поменять модификатор поля (к примеру, с private в public), его тип (к примеру, с Integer в Double).Нельзя, так как модификаторы полей имеют смысл только в compile-time.

Паша01Но просто очень интересно, правильная ли эта точка зрения, что "поля класса, как структуры со своими настройками, которые можно менять как хочется" .Нет. Свойства поля задаются в момент компиляции, и менять их нельзя. Но вы можете, например:
1) Прочитать private поле через reflection/Unsafe.
2) Поменять final поле через reflection/Unsafe.
2) Осуществить volatile чтение/запись не-volatile поля через Unsafe.

То есть механика работы поля жестко определена на момент компиляции. Но есть некоторые хаки, позволяющие это обойти в runtime.
...
Рейтинг: 0 / 0
15.03.2014, 16:38
    #38587177
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
DEVcoach,
Так вот было по ссылке
Код: java
1.
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);


т.е. было поле с модификаторами private static final (в сумме значение 2 + 8 + 16 = 26), а стало private static (в сумме значение 2 + 8 = 10). И потом уже присваивали новое значение
Код: java
1.
field.set(null, newValue);


Модификатор меняли, поле перестало быть константой. Или где-то я ошибся?
...
Рейтинг: 0 / 0
15.03.2014, 20:42
    #38587258
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01 ,
Константность поля - это очень чувствительная вещь, которая имеет значение для компилятора байт-кода и для JIT-компилятора.
Когда вы компилируете исходники в класс, то компилятор, встретив, например:
Код: java
1.
private static final int CONST = 1;

... может скомпилировать такой байт-код, который будет напрямую использовать 1, и не обращаться к этому полю в принципе. Если вы потом в runtime измените значение этого поля, то программа его не увидит, так как по сути вообще к нему не обращается, а просто заинлайнила его значение. Результат: программа сломана.
Поэтому вы должны понимать, что "константность поля" - это вещь, которая используется как в compile time компилятором, байт-кода, так и в runtime JIT-компилятором. Если у вас в compile time поле было константным, а в runtime вы его сделали не константным, и поменяли его значение, то это не значит, что ваша программа перестала считать его константным.
...
Рейтинг: 0 / 0
15.03.2014, 21:10
    #38587281
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
DEVcoach,
Точно, теперь я это вспомнил! Когда декомпилируешь, там вместо полей стоят сразу числовые значения.
Но я на хабре читал статью, что у человека получилось так заменить и программа нормально работала.
Значит у него просто компилятор сразу значение переменной не подставлял?
...
Рейтинг: 0 / 0
17.03.2014, 11:31
    #38587936
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01,

я представляю, что с вами будет, когда вы узнаете, что можно и байт код править, а там ващпе можно голым танцевать и никто не обратит внимания.
...
Рейтинг: 0 / 0
17.03.2014, 11:59
    #38587978
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
ОзверинПаша01,
я представляю, что с вами будет, когда вы узнаете, что можно и байт код править, а там ващпе можно голым танцевать и никто не обратит внимания.
)) и не говори.
Лучше сразу уходить на нейронные сети, биокомпьютер и ИИ.
...
Рейтинг: 0 / 0
17.03.2014, 16:19
    #38588455
Паша01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
А байт код можно править средствами Java?
...
Рейтинг: 0 / 0
17.03.2014, 16:22
    #38588460
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01 ,
Можно - asm, javassist.
...
Рейтинг: 0 / 0
17.03.2014, 17:11
    #38588518
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01А байт код можно править средствами Java?

можно ли средствами java править файл? просто "сборка" проекта слегка усложняется.
...
Рейтинг: 0 / 0
17.03.2014, 18:02
    #38588564
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможности рефлексии
Паша01А байт код можно править средствами Java?Можно даже на бегущей JVM, но там будет VM-specific код (это может не заработать на других версиях JVM).

http://wasm.ru/wault/article/show/unsjav1
http://wasm.ru/wault/article/show/unsafe_ii
http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/


DEVcoachМожно - asm, javassist.Ещё BCEL.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Возможности рефлексии / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]