Java的private和final字段竟然可以被外部类修改?
2017-12-08 16:32
363 查看
一、前言
今天在阅读源码的时候无意中发现被private修饰的变量竟然可以被外部类访问,不仅如此,final声明的变量在某种情况下还可以被修改。这种打破常规的操作就是用到神奇的反射。二、演示
1、访问并修改private修饰的字段
将被外部修改的类public class Person { private String name = "zhangsan"; public String getName() { return name; } }
通过反射去修改外部类的private字段
public 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修饰的字段
被修改的类public class Person { final String sex; public Person() { this.sex = "男"; } }
修改final字段的主类
public 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类为以下的时候
public class Person { final String sex = "男"; }
相关文章推荐
- 没错!java中private字段也是可以访问D!
- Java反射-修改private final成员变量值
- 私有字段private也可以外部访问
- private成员函数竟然可以在类的外部调用
- JAVA 基础笔记之四 final参数可以修改吗?
- java final参数可以修改吗
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
- JAVA 想让类无法new,可以使用private将类的构造函数改为私有的,这样new的时候就会报错了
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- 为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰
- SSH整合项目修改字段不成功但页面可以跳转解决办法
- Java关键字final、static使用总结 (final static在容器中不可以改变容器但可以改变存放)
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等,需要的朋友可以参考下。
- java的小说展示,下载在查看所有(文件路径找不到,可以修改)
- 为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?
- sql 修改表字段时会出现表字段有值 我们可以这么做
- clob大字段jdbc直连(怎么连都可以,这里写的是直连的方法),新增和修改时不乱码的处理
- JAVA修饰符的详细介绍(public protect,default, private,final,abstract)
- Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口
- Java VisualVM 插件地址,安装Visual VM插件,修改下载插件地址使插件可以直接在JVisualVM中进行下载