не может наблюдаться
Я не мог понять изменения заявления в адрес конечного поле
Он говорит, что если конечные переменная объявлена как время компиляции постоянного, то любое изменение в конечном переменном используя отражение API далее в программе не будет отображаться программе во время выполнения.
Для примера рассмотрим код, указанный ниже:
import java.lang.reflect.*;
class ChangeFinal
{
private final int x = 20;//compile time constant
public static void change(ChangeFinal cf)
{
try
{
Class clazz = ChangeFinal.class;
Field field = clazz.getDeclaredField("x");
field.setAccessible(true);
field.set(cf , 190);//changed x to 190 for object cf
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public static void main(String[] args)
{
ChangeFinal cf = new ChangeFinal();
System.out.println(cf.x);//prints 20
change(cf);
System.out.println(cf.x);//prints 20
}
}
Выходной приведенный выше код:
20
20
ПОЧЕМУ?
Ответ заключается в выводе предоставленной javap -c
команды для общественности статической силы основных:
public static void main(java.lang.String[]);
Code:
0: new #3; //class ChangeFinal
3: dup
4: invokespecial #11; //Method "<init>":()V
7: astore_1
8: getstatic #12; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_1
12: invokevirtual #13; //Method java/lang/Object.getClass:()Ljava/lang/Cla
ss;
15: pop
16: bipush 20
18: invokevirtual #14; //Method java/io/PrintStream.println:(I)V
21: aload_1
22: invokestatic #15; //Method change:(LChangeFinal;)V
25: getstatic #12; //Field java/lang/System.out:Ljava/io/PrintStream;
28: aload_1
29: invokevirtual #13; //Method java/lang/Object.getClass:()Ljava/lang/Cla
ss;
32: pop
33: bipush 20
35: invokevirtual #14; //Method java/io/PrintStream.println:(I)V
38: return
}
В строке 16 (перед changeFinal
метод вызывается) значение cf.x
жестко закодировано в 20
. И в строке 33 (после вызова метода changeFinal
) значение cf.x
снова жестко закодировано до 20
. Поэтому, хотя изменение значения конечной переменной x
выполнено успешно на reflection API
во время выполнения, но из-за x
, являющегося константой времени компиляции, отображается постоянное значение 20
.
спасибо за описательный ответ – veritas