作者: Jakob Jenkov 译者:叶文海(yewenhai@gamil.com)

内容索引

访问私有变量

访问私有方法

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

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

访问私有变量

要想获取私有变量你可以调用 Class.getDeclaredField(String name)方法或者 Class.getDeclaredFields()方法。

Class.getField(String name)和 Class.getFields()只会返回公有的变量,无法获取私有变量。下面例子定义了一个包含私有变量的类,在它下面是如何通过反射获取私有变量的例子:

public class PrivateObject {

private String privateString = null;

public PrivateObject(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 class PrivateObject {

private String privateString = null;

public PrivateObject(String privateString) {

this.privateString = privateString;

}

private String 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 私有变量和私有方法相关推荐

  1. java中for break的用法_java break语句的使用方法

    在switch语中,break语句用来终止switch语句的执行.使程序 switch语句后的第一个语句 开始执行. 在Java中,可以为每个代码块加一个括号,一个代码块通常 用大括号{}括起来的一段 ...

  2. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...

    [单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...

  3. java中的case1怎么说_Java 中的 CAS 简述及原理解析

    一.CAS 是什么? CAS(Compare And Swap),比较并交换,它是一条CPU并发原语.它的功能是判断内存某个位置的值是否为预期值,如果是则更新为新的值,这个过程是原子的.1 publi ...

  4. java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  5. java 基本类型 不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  6. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  7. Java中url传递中文参数取值乱码的解决方法

    Java中url传递中文参数取值乱码的解决方法 参考文章: (1)Java中url传递中文参数取值乱码的解决方法 (2)https://www.cnblogs.com/liwenjuan/p/3211 ...

  8. JAVA中的多线程(八):线程的优先级和yield方法

    JAVA中的多线程(八):线程的优先级和yield方法 优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runna ...

  9. java中给对象的List集合去重的几种方法(Lambda)

    java中给对象的List集合去重的几种方法 前言 一.lambda表达式的去重方式 二.Stream API中的collect去重方法 三.Stream API 中的distinct方法去重 前言 ...

  10. java中完成md5加密解密_java实现md5加密解密 notNET中加密和解密的实现方法

    java实现md5加密解密 notNET中加密和解密的实现方法 亦或是旅途风光 7-14 1918℃ 22 [ ee21.cn - ASP.NET ] .NET将原来独立的API和SDK合并到一个框架 ...

最新文章

  1. calendar 获取季度的第一天_Java日期查询:日、周、旬、月、季度、年等时间操作...
  2. python词云去除词_使用Python制作一个带GUI界面的词云自动生成工具(连载五)
  3. 那个双非本科,还想转算法岗的姑娘,最后怎么了?
  4. 【pyqt5学习】——tablewidget控件学习
  5. 二值神经网络重大突破,第一次胜过MobileNet!-1与+1的三年艰苦跋涉
  6. mysql5.7.10 performance_schema_MySQL的show profile简介以及该功能在MySQL 5.7中performance_schema中的替代...
  7. 自建服务器选择标准,自建CDN如何选择服务器
  8. 腾讯企业邮箱申请注册注意事项
  9. Java面试精选(6):单例模式有几种写法?
  10. 《天才在左 疯子在右》读书记
  11. CRM和SCRM,到底有什么区别?
  12. 网页中无法直接关注微信公众号怎么办?一键唤起微信关注公众号的解决方案
  13. 【科学文献计量】知识单元的频次统计与分布(简单阅览和完整频次统计)
  14. 浏览器翻译插件 沙拉查词;图片翻译;pdf 阅读器软件、pdf翻译工具
  15. 电脑检查内存条型号的方法
  16. 中病毒spoolsv.exe
  17. 戴老师论文阅读:Two-Timescale Channel Estimation for Reconfigurable Intelligent Surface Aided Wireless...
  18. 顶级技术公司的CEO是如何看待AI的?
  19. 啊哈C语言 第六章 【代码】【习题答案】
  20. android 纵向抽屉,Android导航抽屉垂直边框

热门文章

  1. [转]关于卢平的一些想法
  2. HTML5 1.4 列表
  3. 通信行业英文缩写整理(待更新)
  4. JAVA计算等额本金还款列表
  5. 软件工程改错题例题:请将下面的非结构化程序改成结构化程序
  6. 视频直播app和网页版怎么开发?
  7. java计算机毕业设计河南省农村多元化养老服务管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
  8. 爬虫之旅(一):爬取b站首页的源代码
  9. 遗传算法实现寻找函数最值
  10. 使用Unity的AR Foundation导出到安卓时出现黑屏问题的可能原因