在通常的观点中从对象的外部访问私有变量以及方法是不允许的,但是Java反射机制可以做到这一点。使用这个功能并不困难,在进行单元测试时这个功能非常有效。本节会向你展示如何使用这个功能。

注意:这个功能只有在代码运行在单机Java应用(standalone Java application)中才会有效,就像你做单元测试或者一些常规的应用程序一样。如果你在Java Applet中使用这个功能,那么你就要想办法去应付SecurityManager对你限制了。但是一般情况下我们是不会这么做的,所以在本节里面我们不会探讨这个问题。

访问私有变量

要想获取私有变量你可以调用Class.getDeclaredField(String name)方法或者Class.getDeclaredFields()方法。Class.getField(String name)和Class.getFields()只会返回公有的变量,无法获取私有变量。下面例子定义了一个包含私有变量的类,在它下面是如何通过反射获取私有变量的例子:

public classPrivateObject {private String privateString = null;publicPrivateObject(String privateString) {this.privateString =privateString;

}

}

PrivateObject privateObject= new PrivateObject("The Private Value");

Field privateStringField= PrivateObject.class.

getDeclaredField("privateString");

privateStringField.setAccessible(true);

String fieldValue=(String) privateStringField.get(privateObject);

System.out.println("fieldValue = " + fieldValue);

这个例子会输出”fieldValue = The Private Value”,The Private Value是PrivateObject实例的privateString私有变量的值,注意调用PrivateObject.class.getDeclaredField(“privateString”)方法会返回一个私有变量,这个方法返回的变量是定义在PrivateObject类中的而不是在它的父类中定义的变量。

注意privateStringField.setAccessible(true)这行代码,通过调用setAccessible()方法会关闭指定类Field实例的反射访问检查,这行代码执行之后不论是私有的、受保护的以及包访问的作用域,你都可以在任何地方访问,即使你不在他的访问权限作用域之内。但是你如果你用一般代码来访问这些不在你权限作用域之内的代码依然是不可以的,在编译的时候就会报错。

访问私有方法

访问一个私有方法你需要调用 Class.getDeclaredMethod(String name, Class[] parameterTypes)或者Class.getDeclaredMethods() 方法。 Class.getMethod(String name, Class[] parameterTypes)和Class.getMethods()方法,只会返回公有的方法,无法获取私有方法。下面例子定义了一个包含私有方法的类,在它下面是如何通过反射获取私有方法的例子:

public classPrivateObject {private String privateString = null;publicPrivateObject(String privateString) {this.privateString =privateString;

}privateString getPrivateString(){return this.privateString;

}

}

PrivateObject privateObject= new PrivateObject("The Private Value");

Method privateStringMethod= PrivateObject.class.

getDeclaredMethod("getPrivateString", null);

privateStringMethod.setAccessible(true);

String returnValue=(String)

privateStringMethod.invoke(privateObject,null);

System.out.println("returnValue = " + returnValue);

这个例子会输出”returnValue = The Private Value”,The Private Value是PrivateObject实例的getPrivateString()方法的返回值。

PrivateObject.class.getDeclaredMethod(“privateString”)方法会返回一个私有方法,这个方法是定义在PrivateObject类中的而不是在它的父类中定义的。

同样的,注意Method.setAcessible(true)这行代码,通过调用setAccessible()方法会关闭指定类的Method实例的反射访问检查,这行代码执行之后不论是私有的、受保护的以及包访问的作用域,你都可以在任何地方访问,即使你不在他的访问权限作用域之内。但是你如果你用一般代码来访问这些不在你权限作用域之内的代码依然是不可以的,在编译的时候就会报错。

java定义私有变量_Java Reflection(七):私有变量和私有方法相关推荐

  1. java 私有成员方法_Java Reflection 教程(7):类私有成员变量和方法

    一般来说,不可以访问类的私有成员变量和调用类的私有方法.但通过Java Reflection API可以绕过这个限制,前面使用的getMethods, getFields,getConstructor ...

  2. Java入参关键字_Java基础17-成员变量、return关键字和多参方法

    1.成员变量 在类中声明的变量为成员变量 //Dog类 class Dog{ String name;//成员变量 } public class Test1{ public static void m ...

  3. java实例变量成员变量_Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法...

    总是被这些相似的概念搞晕,查阅了资料后做个小总结,以变量为例,方法辨析类似. 1.多胞胎名字汇总辨析 成员变量和成员方法是范围最大的定义,提到成员变量就可以理解成你所定义在一个类体中的各类变量的统称, ...

  4. java基础变量_Java基础语法之变量和常量

    上行没有"{"时,下行代码与上行首字母对齐 标识符 概述 在Java中对变量.常量.函数和语句块都是有名字的,他们的名字统称为Java标识符.是为类.对象.方法.变量.接口和自定义 ...

  5. java定义三角类_Java先创建一个point类然后定义trianglete类,在trianglete类中定义三个point的实体表示三角形的三个点。...

    Java先创建一个point类然后定义trianglete类,在trianglete类中定义三个point的实体表示三角形的三个点. 关注:197  答案:1  mip版 解决时间 2021-01-3 ...

  6. java定义数组范围_Java数组的定义和使用

    为什么需要数组? 问题:我们要计算30个学生的平均分 如果没有数组,我们的代码是这样的 int score1 = 32; int score2 = 56; int score3 = 78; //--此 ...

  7. java实验 输入输出流_java实验七 输入输出流

    有关java的实验和程序 实验七 输入输出流 一.实验目的和要求 目的: 1.掌握使用输入输出流进行文件的读写操作. 要求: 1.实验报告给出内容1,2的填充代码以及内容3的全部源代码. 二.实验内容 ...

  8. java如何配置环境_java如何配置环境变量

    展开全部 首先下载好jdk,直接双击就可以安装,安装比较简单,基本都是点62616964757a686964616fe78988e69d8331333365653832击"下一步" ...

  9. java 反射 成员变量_Java 反射:成员变量

    获取成员变量 借助Class类某些可以获取对应类中声明的成员变量实例对象,这些方法有: ⑴Field[] getFields():返回一个该Class对象表示类或接口中所有public属性(含继承的) ...

最新文章

  1. JQery遍历方法each
  2. jquery form java_springmvc利用jquery.form插件异步上传文件示例
  3. Leetcode每日一题:67.add-binary(二进制求和)
  4. 南阳市服务器主机销售,南阳市服务器价格
  5. 我的软件项目过程管理经验
  6. 写出规范化的高可读性的函数代码注释
  7. linux boot 空间不足,解决Ubuntu 提示boot分区空间不足办法
  8. 番外5. Python OpenCV 中滑动条详细说明与常见问题解决方案
  9. python3 判断.xlsl表的两列是否一致
  10. 充电水滴融合特效 html+css
  11. WooCommerce——产品过滤器WooCommerce Products Filter
  12. 黑洞(black hole)
  13. MATLAB | 绘制复指数函数 y = exp(j*w*n)的三维图像
  14. 计算机术语中英文对照
  15. 基于PaddleOCR银行卡识别实现(二)
  16. window10快速关机小技巧(超级简单)
  17. 新版Edge检查项F12控制台改为英文
  18. Rails permit params 接受Hash,Array
  19. YII2 路由问题-摘自yii2官方文档
  20. CSAPP Lab3: Buffer Bomb

热门文章

  1. 弘玑Cyclone代表中国RPA进入Gartner魔力象限:迄今国内厂商最佳排名,迈入全球一线阵营
  2. Nuxt入门到打包部署 Vue-SSR项目
  3. Java在手机平台上的Porting
  4. 向PSRAM中写入、读取数据
  5. 淘宝双十一自动化领喵币python脚本
  6. 嗨格式Heic图片转换器v1.0.13.1436官方版
  7. ae制作小球轨迹运动_视频剪辑教程:AE动画教程,如何创建一个运动的小球
  8. A站APP acfun APP产品体验报告
  9. 李迅雷+趋势的力量+K型分化时代如何赢取超额收益
  10. 【小程序源码】视频壁纸支持多种分类短视频另外也有静态壁纸