一、前言
今天在阅读源码的时候无意中发现被private修饰的变量竟然可以被外部类访问,不仅如此,final声明的变量在某种情况下还可以被修改。这种打破常规的操作就是用到神奇的反射。
二、演示
1、访问并修改private修饰的字段
将被外部修改的类
复制代码
1
2
3
4
5
6public class Person { private String name = "zhangsan"; public String getName() { return name; } }
通过反射去修改外部类的private字段
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class Main { public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Person person = new Person(); String curName = person.getName(); System.out.println("修改前的name:"+curName); Field field = Person.class.getDeclaredField("name");//通过反射获取name字段 field.setAccessible(true); //这一步是关键,将访问name字段的权限打开 field.set(person, "lisi"); //修改被private修饰的name String afterName = person.getName(); System.out.println("修改后的name:"+afterName); } }
运行结果
2、修改被final修饰的字段
被修改的类
复制代码
1
2
3
4
5
6public class Person { final String sex; public Person() { this.sex = "男"; } }
修改final字段的主类
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13public class Main { public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Person person = new Person(); String curSex = person.sex; System.out.println("修改前的sex:"+curSex); Field field = Person.class.getDeclaredField("sex");//通过反射获取sex字段 field.setAccessible(true); field.set(person, "女"); //修改被final修饰的sex String afterSex = person.sex; System.out.println("修改后的sex:"+afterSex); } }
运行结果
注:如果final修饰的字段已经被初始化了,则不能通过反射去修改该字段。如Person类为以下的时候
复制代码
1
2
3public class Person { final String sex = "男"; }
最后
以上就是震动滑板最近收集整理的关于Java的private和final字段竟然可以被外部类修改?一、前言二、演示的全部内容,更多相关Java内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复