powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Возможности рефлексии
13 сообщений из 13, страница 1 из 1
Возможности рефлексии
    #38586989
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Недавно открыл для себя рефлексию и узнал, что можно даже изменять значение поля private final static во время выполнения программы.
После этого возникла точка взгляда на поля класса, как на структуры со своими настройками, которые можно менять как хочется.
И стало очень интересно, а можно ли поменять модификатор поля (к примеру, с private в public), его тип (к примеру, с Integer в Double).
Я понимаю, что практически это нецелесообразно, потому что если сумел изменить значение поля, то на модификаторы уже плевать.
Но просто очень интересно, правильная ли эта точка зрения, что "поля класса, как структуры со своими настройками, которые можно менять как хочется" .
Да и если так можно сделать, покажите код, а то методов типо setModifier() нету(((
...
Рейтинг: 0 / 0
Возможности рефлексии
    #38587158
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паша01,
Паша01а можно ли поменять модификатор поля (к примеру, с private в public)
так точно можно
...
Рейтинг: 0 / 0
Возможности рефлексии
    #38587163
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это да, тут же для изменения значения константы меняли модификатор.
Интересно, а что с типом делать, можно ли менять его?
...
Рейтинг: 0 / 0
Возможности рефлексии
    #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
Возможности рефлексии
    #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
Возможности рефлексии
    #38587258
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паша01 ,
Константность поля - это очень чувствительная вещь, которая имеет значение для компилятора байт-кода и для JIT-компилятора.
Когда вы компилируете исходники в класс, то компилятор, встретив, например:
Код: java
1.
private static final int CONST = 1;

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

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

можно ли средствами java править файл? просто "сборка" проекта слегка усложняется.
...
Рейтинг: 0 / 0
Возможности рефлексии
    #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
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Возможности рефлексии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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