|
|
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Всем привет! Недавно открыл для себя рефлексию и узнал, что можно даже изменять значение поля private final static во время выполнения программы. После этого возникла точка взгляда на поля класса, как на структуры со своими настройками, которые можно менять как хочется. И стало очень интересно, а можно ли поменять модификатор поля (к примеру, с private в public), его тип (к примеру, с Integer в Double). Я понимаю, что практически это нецелесообразно, потому что если сумел изменить значение поля, то на модификаторы уже плевать. Но просто очень интересно, правильная ли эта точка зрения, что "поля класса, как структуры со своими настройками, которые можно менять как хочется" . Да и если так можно сделать, покажите код, а то методов типо setModifier() нету((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 01:01 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша01, Паша01а можно ли поменять модификатор поля (к примеру, с private в public) так точно можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 15:31 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Это да, тут же для изменения значения константы меняли модификатор. Интересно, а что с типом делать, можно ли менять его? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 15:47 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша01И стало очень интересно, а можно ли поменять модификатор поля (к примеру, с private в public), его тип (к примеру, с Integer в Double).Нельзя, так как модификаторы полей имеют смысл только в compile-time. Паша01Но просто очень интересно, правильная ли эта точка зрения, что "поля класса, как структуры со своими настройками, которые можно менять как хочется" .Нет. Свойства поля задаются в момент компиляции, и менять их нельзя. Но вы можете, например: 1) Прочитать private поле через reflection/Unsafe. 2) Поменять final поле через reflection/Unsafe. 2) Осуществить volatile чтение/запись не-volatile поля через Unsafe. То есть механика работы поля жестко определена на момент компиляции. Но есть некоторые хаки, позволяющие это обойти в runtime. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 15:47 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Так вот было по ссылке Код: java 1. т.е. было поле с модификаторами private static final (в сумме значение 2 + 8 + 16 = 26), а стало private static (в сумме значение 2 + 8 = 10). И потом уже присваивали новое значение Код: java 1. Модификатор меняли, поле перестало быть константой. Или где-то я ошибся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 16:38 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша01 , Константность поля - это очень чувствительная вещь, которая имеет значение для компилятора байт-кода и для JIT-компилятора. Когда вы компилируете исходники в класс, то компилятор, встретив, например: Код: java 1. ... может скомпилировать такой байт-код, который будет напрямую использовать 1, и не обращаться к этому полю в принципе. Если вы потом в runtime измените значение этого поля, то программа его не увидит, так как по сути вообще к нему не обращается, а просто заинлайнила его значение. Результат: программа сломана. Поэтому вы должны понимать, что "константность поля" - это вещь, которая используется как в compile time компилятором, байт-кода, так и в runtime JIT-компилятором. Если у вас в compile time поле было константным, а в runtime вы его сделали не константным, и поменяли его значение, то это не значит, что ваша программа перестала считать его константным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 20:42 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
DEVcoach, Точно, теперь я это вспомнил! Когда декомпилируешь, там вместо полей стоят сразу числовые значения. Но я на хабре читал статью, что у человека получилось так заменить и программа нормально работала. Значит у него просто компилятор сразу значение переменной не подставлял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 21:10 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша01, я представляю, что с вами будет, когда вы узнаете, что можно и байт код править, а там ващпе можно голым танцевать и никто не обратит внимания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2014, 11:31 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
ОзверинПаша01, я представляю, что с вами будет, когда вы узнаете, что можно и байт код править, а там ващпе можно голым танцевать и никто не обратит внимания. )) и не говори. Лучше сразу уходить на нейронные сети, биокомпьютер и ИИ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2014, 11:59 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
А байт код можно править средствами Java? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2014, 16:19 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша01 , Можно - asm, javassist. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2014, 16:22 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша01А байт код можно править средствами Java? можно ли средствами java править файл? просто "сборка" проекта слегка усложняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2014, 17:11 |
|
||
|
Возможности рефлексии
|
|||
|---|---|---|---|
|
#18+
Паша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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2014, 18:02 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38588455&tid=2127490]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
191ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 530ms |

| 0 / 0 |
