反射代码:

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()方法会破坏类的访问规则,产生安全隐患,我在知乎上面看到的一篇回答貌似很有道理:

private修饰的方法可以通过反射访问,那么private的意义是什么?的更多相关文章

  1. [C#] 解决Silverlight反射安全关键(SecuritySafeCritical)时报“System.MethodAccessException: 安全透明方法 XXX 无法使用反射访问”的问题

    作者: zyl910 一.缘由 在Silverlight中使用反射动态访问时,经常遇到"System.MethodAccessException: 安全透明方法 XXX 无法使用反射访问-- ...

  2. java private修饰的类和变量

    private主要用来修饰变量和方法,一般不会用来修饰类,除非是内部类. 1.new对象 被private修饰的变量和方法,只能在自己对象内部使用,其他对象即使是new你这个对象也是获取不到被priv ...

  3. java利用反射访问类的私有(private)属性及方法

    Java语言中,在一个类中,为了不让外界访问到有的属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的 ...

  4. .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压

    以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  5. java中方法的控制修饰符也分为:可访问控制符和非访问控制符两类。

    3 .方法的控制修饰符也分为:可访问控制符和非访问控制符两类. 可访问控制符有 4 种:公共访问控制符: public :私有访问控制符: private :保护访问控制符: protected :私 ...

  6. java中用反射访问私有方法和私有成员[转]

    转自: http://zhouyangchenrui.iteye.com/blog/470521 java的反射可以绕过访问权限,访问到类的私有方法和成员.可能这点会引起安全性的讨论.反射的使用帮助解 ...

  7. C#学习笔记06--类/对象/访问修饰符/方法

    编程思想   1.面向过程   面向过程是要把问题解决的过程分成有一定顺序的不同步骤, 然后按照步骤一步步的将问题解决.   2.面向对象   面向对象解决问题的思路是先分析问题中所涉及的对象, 然后 ...

  8. 129-PHP子类不能访问父类private修饰的类成员

    <?php class father{ //定义father类 //定义private修饰的类成员和方法 private $hair='curly hair'; private function ...

  9. 灵光一闪-VS设计界面能访问到private修饰的各种控件

    大家都知道,用VS设计界面时,VS默认控件的访问修饰符为private,但是我就很奇怪,private修饰的字段不是只有类内部才能访问吗? 好神奇的VS,这到底是怎么实现的?难道就是类似文本编辑器的作 ...

随机推荐

  1. python 异常和弹出框

    import tkinter.messagebox try: fileContent = open("abnormal.txt") fileContent.close() prin ...

  2. Qt第三方库libvlc-qt——ubuntu上编译、安装,测试

      cmake 3.0编译安装(最低版本要求): sudo apt-get install ncurses-dev sudo apt-get install build-essential 下载cma ...

  3. java8 lamda 表达式

  4. Spring Boot Cli下载安装

    本地下载地址: spring-boot-cli-2.1.8.RELEASE-bin.zip  : https://pan.baidu.com/s/1GMyxj1PecsM4BG_hzoteVQ spr ...

  5. Breadcrumb 面包屑

    显示当前页面的路径,快速返回之前的任意页面. 基础用法 适用广泛的基础用法. 在el-breadcrumb中使用el-breadcrumb-item标签表示从首页开始的每一级.Element 提供了一 ...

  6. springboot实现内存缓存

    题记:实现缓存大部分可以使用redis实现,简单.便捷,redis在针对应用部署多服务器是很好的,但如果针对单一服务器,内存缓存更好. 1.创建CacheLoader.java import java ...

  7. Web jsp开发自学——ajax+servlet+echarts+json+gson 实现ajax传输servlert和echarts的数据,可视化结果

    感谢下面的博主,我学习的博客有: https://blog.csdn.net/ITBigGod/article/details/81023802  Jsp+Servlet+Echarts实现动态数据可 ...

  8. k8s 删除ns 卡住的解决办法

    在某些情况下,在k8s中会无法删除某个namespace,它会一直卡在terminating状态下.解决这个问题的步骤为: kubectl api-resources --verbs=list --n ...

  9. 例子 使用sqlite3 数据库建立数据方式

    #!/usr/bin/env python#coding:utf-8import sqlite3#建立一个数据库cx = sqlite3.connect("E:/test.db") ...

  10. python pandas dataframe 读取和写入Oracle

    1.代码:主要写入时表要为小写,否则报错 Could not reflect: requested table(s) not available in Engine from sqlalchemy i ...