反射代码:

package test;

public class Person {

    private String userName= "Tom";

    private void playGame() {
System.out.println(userName+ "悄悄玩儿游戏");
} }
package test;

import java.lang.reflect.Field;
import java.lang.reflect.Method; public class Private { public static void main(String[] args) throws Exception { Person person = new Person();
Class c = person.getClass(); //Class c2 = Class.forName("test.Person");
//Person person2 = (Person)c2.newInstance(); Method method = c.getDeclaredMethod("playGame");
method.setAccessible(true);
method.invoke(person); Field field = c.getDeclaredField("userName");
field.setAccessible(true);
field.set(person,"John");
method.invoke(person); } }

输出结果:

Tom悄悄玩儿游戏
John悄悄玩儿游戏

在这里面很关键的一处代码是 setAccessible(true),这行代码取消了java的权限控制检查。调用了类Person的private方法,并且修改了其private成员变量的值。

private的意义是什么?

  1. private并不是解决安全问题的,如果想让解决代码的安全问题,请用别的办法。
  2. private的意义是OOP(面向对象编程)的封装概念。

而对于setAccessible()方法会破坏类的访问规则,产生安全隐患,我在知乎上面看到的一篇回答貌似很有道理:

最新文章

  1. 搭建LNAMP环境(二)- 源码安装Nginx1.10
  2. 构建 Android 应用程序一定要绕过的 30 个坑
  3. javascript之原型模式学习
  4. PPT开发 * .pps 文件类型
  5. EF架构~有时使用SQL更方便
  6. QT 数据库编程一
  7. vs2015连接oracle 11g(.net自带方式 using System.Data.OracleClient;)
  8. ASP.NET的一次奇遇:UserControl写成Control引发的w3wp进程崩溃
  9. [流媒体]VLC主要模块
  10. C++ STL之排序算法
  11. 不同浏览器创建XMLHttpRequest对象
  12. MCU助推居家移动医疗微型化
  13. Android 定义重名权限问题
  14. Java基础笔记8
  15. http2.0与http1.X的区别
  16. [HTTP] tcp/ip详解 链路层 网络层 传输层 应用层
  17. Win7 下面升级VS2017 vs_community install Microsoft.Windows.D3DCompiler.Msu.Win7
  18. camera按键采集图像及waitKey的用法
  19. CAN 总线通信控制芯片SJA1000 的读写
  20. JavaScript 保留两位小数

热门文章

  1. 通过ID获取元素
  2. 离线安装nuget包EPPlus
  3. 学习Oracle数据库入门到精通教程资料合集
  4. python格式化字符串format的用法
  5. 内存或磁盘空间不足,word无法显示所请求的字体
  6. web站点放在nginx其他目录下
  7. 【JVM学习笔记】打破双亲委托机制的例子
  8. django在进行模板render(渲染)时,对传过来的是字典中包含字典应用方法
  9. Linux 学习路径
  10. 【ABAP系列】SAP 使用特殊的技术更新数据库(ABAP)