一般来说,不可以访问类的私有成员变量和调用类的私有方法。但通过Java Reflection API可以绕过这个限制,前面使用的getMethods, getFields,getConstructors 等方法都是返回的类的public 方法,类成员和构造函数。

本篇介绍如何使用Java Reflection API来访问类的私有成员。

1. 访问私有成员

Class的getDeclaredField(String name) 和getDeclaredFields 可以返回类的所有成员变量包括私有成员变量。

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);

上面代码可以方法类PrivateObject的私有成员privateString。要注意的是privateStringField.setAccessible(true);必须打开类成员的访问控制后才可以访问该私有成员。也只有使用Java Reflection API 才可以访问类的私有成员。

2. 访问类的私有方法

同样Class的getDeclaredMethod(String name) 和getDeclaredMethods 可以用来访问类额私有方法。

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);

同样需要调用privateStringMethod.setAccessible(true);打开对该私有方法的访问控制后才可访问该私有成员方法。

java 私有成员方法_Java Reflection 教程(7):类私有成员变量和方法相关推荐

  1. java 访问类变量_如何访问类的成员变量和方法

    在Java应用程序中,经常需要访问类的成员变量和方法,以实现程序的功能,请问应该如何访问类的成员变量和方法?在Java中通过类的实例(即对象)点(.)运算符来访问类的成员变量和方法,今天百分网小编为大 ...

  2. java访问成员变量和方法_如何访问类的成员变量和方法

    如何访问类的成员变量和方法 在Java应用程序中,经常需要访问类的成员变量和方法,以实现程序的功能,请问应该如何访问类的成员变量和方法?在Java中通过类的实例(即对象)点(.)运算符来访问类的成员变 ...

  3. java面试题2 牛客:定义类中成员变量时不可能用到的修饰是

    懵逼树上懵逼果,懵逼树下你和我 第二题 定义类中成员变量时不可能用到的修饰是() A final B void C protected D static 一看到这道题,有点慌了,直接选c,很显然,我又 ...

  4. Java语言基础Day14(内部类、类作为成员变量类型、接口作为成员变量类型、接口作为方法的参数或返回值、红包案例、JDK9的JShell、编译器的两点优化)

    今日内容 一.内部类 1.内部类的概念与分类 2.成员内部类的定义 3.成员内部类的使用 4.内部类的同名变量访问 5.局部内部类定义 6.局部内部类的final问题 7.匿名内部类 匿名内部类定义格 ...

  5. 我终于明白了!!!类、成员变量、方法、以及如何定义他们,还有static到底干啥用?

    今天是大年初五呀,迎财神的日子!最近一直都忙着背英语单词,刷韩老师的课程,看<Java疯狂讲义>.看书 最近看了几本关于自我成长不错的书籍,也慢慢摆脱了追求阅读速度的急切心理,有句话感觉说 ...

  6. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  7. Java码农进阶之路~构造方法静态与成员变量及方法

    一 构造方法 当你在这个类中没有提供无参的构造方法的时候,系统会在你创建对象的时候,也会调用无参的构造,而这个无参方法,系统会帮你提供一个. 如果你只是提供了有参的构造方法,那么系统将不再给你提供 无 ...

  8. 一个类怎样引用另外一个类的成员变量或方法

    通常常用的有:A类有个变量C,B类想调用C方法一:变量C是非静态的(static),那么在B类中创建一个A类的对象,用对象.变量名就可以了方法二:变量C是静态的(static),直接用类.变量名 详细 ...

  9. java中的类、成员变量、方法的修饰符。

    http://blog.sina.com.cn/s/blog_7ffb8dd501011alw.html http://www.cnblogs.com/lixiaolun/p/4311727.html ...

最新文章

  1. InstallShield学习笔记(2)-建立快捷方式
  2. 关于Quartz.NET作业调度框架的一点小小的封装,实现伪AOP写LOG功能
  3. Java基础super关键字、final关键字、static关键字、匿名对象整理
  4. 007_Buzz事件
  5. sequence跳号问题及解决办法
  6. linux字符模式分辨率grub2,Deepin 15.8系统Grub菜单分辨率低的原因及解决方案
  7. 一秒等于多少毫秒_全国首批!海宁5G正式商用!用手机的人必看!快多少?价贵吗?怎么换?...
  8. Jmeter接口测试实例图文示例
  9. Linux卡巴斯基杀毒(kesl)基础操作
  10. MCMC算法—MH算法的Python实现(一)
  11. MAC搭建ios自动化测试环境
  12. 计算机实训实验报告,审计实务实验报告总结审计实训实验报告计算机审计实验总结...
  13. Python之建模数值逼近篇–最小二乘拟合
  14. cf Round#779 D 388535
  15. java基础之 IO流
  16. cisco pkt 路由器配置基础及接口配置 路由协议与交换技术
  17. 湘大c语言期末考试试题及答案,湘大机房c语言试题.doc
  18. Camtasia喀秋莎2022经典版能编辑4K视频
  19. verilog学习记(学习设计cpu)
  20. 四川安湖科技:抖音开店有什么流程

热门文章

  1. 盘点分库分表中,你一定要避开的那些坑!
  2. 解读知识蒸馏模型TinyBert
  3. APP搜索如何又快又准?
  4. 2020HC大会上,这群人在讨论云原生…
  5. 小熊派IoT开发板系列教程正式发布——免费学习
  6. Too many open files的四种解决办法
  7. Apache软件基金会Member陈亮:一名开源拓荒者的 Apache之旅
  8. hpunix查看oracle监听,hp-ux 网络查看
  9. gradle命令无法识别
  10. 关于老师给的数据集,链接1