参考链接: Java中的final最终变量
先上实例代码:
package JavaDay5_29;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* @author myvina@qq.com
* @date 18-5-29 上午11:02
*/
public class Demo1 {
public final List<String> list;
public List<String> getList() {
return list;
}
public Demo1() {
list = new ArrayList<>();
list.add("It cat't be changed.");
}
@Test
void testChange() {
Demo1 demo1 = new Demo1();
System.out.println(demo1.getList());
// demo1.list = null;
Class demo1Class = demo1.getClass();
try {
Field demo1List = demo1Class.getDeclaredField("list");
// demo1List.setAccessible(true);
List<String> list = new LinkedList<>();
list.add("It's really changed.");
demo1List.set(demo1, list);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(demo1.getList());
}
}
上述代码中第一个注释部分表示该final型成员变量第一次初始化后不可更改。但通过Java反射机制可以获取list字段并更改它的引用。程序运行结果如下:
从结果可以看出final类型成员变量确实被更改了。