当前位置: 首页 > 编程日记 > 正文

Java反射 - 私有字段和方法

尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法。 这并不困难。 这在单元测试中可以非常方便。 本文将告诉你如何。

访问私有字段

要访问私有字段,您需要调用Class.getDeclaredField(String name)或Class.getDeclaredFields()方法。 方法Class.getField(String name)和Class.getFields()方法只返回公共字段,所以它们将不起作用。 下面是一个带有私有字段的类的简单例子,下面是通过Java反射访问该字段的代码:

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”文本,该文本是在代码示例开始时创建的PrivateObject实例的private字段privateString的值。

注意使用PrivateObject.class.getDeclaredField(“privateString”)方法。 这是这个方法调用返回私人字段。 此方法只返回在该特定类中声明的字段,而不是在任何超类中声明的字段。

注意粗线也是。 通过调用Field.setAccessible(true),可以关闭对此特定字段实例的访问检查,仅用于反射。 现在,即使调用者不是这些范围的一部分,即使它是私有的,受保护的或包的范围,也可以访问它。 您仍然无法使用正常代码访问该字段。 编译器不会允许它。

访问私有方法

要访问私有方法,您将需要调用Class.getDeclaredMethod(String name,Class [] parameterTypes)或Class.getDeclaredMethods()方法。 方法Class.getMethod(String name,Class [] parameterTypes)和Class.getMethods()方法只返回公共方法,所以它们将不起作用。 下面是一个带私有方法的类的简单示例,下面是通过Java反射访问该方法的代码:

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

此代码示例将在代码示例的开头处创建的PrivateObject实例上调用时,打印出文本“returnValue = The Private Value”,这是getPrivateString()方法返回的值。
注意使用PrivateObject.class.getDeclaredMethod(“privateString”)方法。 正是这个方法调用返回私有方法。
通过调用Method.setAccessible(true),可以关闭此特定Method实例的访问检查,仅用于反射。 现在,即使调用者不是这些范围的一部分,即使它是私有的,受保护的或包的范围,也可以访问它。 您仍然无法使用普通代码访问该方法。 编译器不会允许它。

实战

package com.reflection.detail;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;/*** Created by Fant.J.* 2018/2/7 15:28*/
public class Reflection_Private {public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {//获取对象Class aClass = People.class;Field  privateField = aClass.getDeclaredField("privateString");//设置允许jvm编译通过。(jvm 默认不允许访问 私有类型的东西)privateField.setAccessible(true);//获取私有字段的值People people = new People();Object privateStringResult = privateField.get(people);System.out.println(privateStringResult);//获取私有方法//获取setPrivateString方法Method privateMethod = aClass.getDeclaredMethod("setPrivateString", String.class);//获取getPrivateString方法Method privateMethod1 = aClass.getDeclaredMethod("getPrivateString", null);//jvm编译通过允许privateMethod.setAccessible(true);//反射对象和参数 给setPrivateString方法privateMethod.invoke(people,"Fant.J is so cool");//反射对象和参数 给getPrivateString方法Object obj = privateMethod1.invoke(people,null);System.out.println(obj);}
}
package com.reflection.detail;/*** Created by Fant.J.* 2018/2/7 14:37*/
public class People {private Integer id;private String name;//field 字段public String someField = "FantJ";private String privateString = "shuai";public People(Integer id, String name) {this.id = id;this.name = name;}public String getSomeField() {return someField;}public void setSomeField(String someField) {this.someField = someField;}public String getPrivateString() {return privateString;}public void setPrivateString(String privateString) {this.privateString = privateString;}public People(){}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
shuai
Fant.J is so cool

项目代码:github链接

相关文章:

.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西。现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功。在05年的时候,Scott Hanselman(微软的一个Principa…

一个小小的AI训练营竟然卧虎藏龙

年前,我来到了一个近墨者黑的地方,黑的不能再黑。。。这个神秘的组织叫做 21 天入门机器学习训练营。讲真的,当初报名这个训练营,我是冲着机器学习来的,主要是好奇想转型,而且听说这个课程对小白很友好&…

【Qt】QCamera查询和设置摄像头的分辨率

查询和设置摄像头分辨率的API QCamera::supportedViewfinderResolutions() QCamera::setViewfinderSettings() 设置摄像头帧率、比例、分辨率、格式的类:QCameraViewfinderSettings 使用注意事项 查询和设置摄像头分辨率时,需要在摄像头启动后调用&a…

附录G Netty与NettyUtils

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/beliefer/article/details/77450134 注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。…

grails日志系统的研究

对于grails的日志输出,我真的是给弄吐血了。开始以为很简单,后来发现grails封装log4j做的有点太多了,很多东西的封装理解了觉得还挺合理,但是不理解的话真是无比迷茫。对于是否有必要做这么多强制性约束,我保留意见...…

给老婆写个Python教程

作者 | 水风 来源 | 水风知乎问答 如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 什么是code code就是一种语言,一种计算机能读懂的语言。计算机是一个傻逼,他理解不了默认两可的任何东西。比如&#xf…

SpringBoot的修改操作

今天学习SpringBoot 的 CRUD 操作,练习 修改操作 时,发生了如下的异常: [nio-8080-exec-7] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.dao.InvalidDataAccessApiUsa…

【Qt】QImage、QPixmap、QBitmap和QPicture

简述 Qt 提供了四个用于处理图像数据的类: QImage、 QPixmap、 QBitmap和QPicture。QImage是为 I/O 设计和优化的, 用于直接像素访问和操作, 而QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap继承自QPixmap,用在位深为1(黑白图片)上。…

ASP.NET,IIS7.0 上传大视频文件报错

一、问题概述: 最近开发上传视频文件的功能。基本流程已经跑通了,可是上传30M以上的文件时就会报错。 二、资料海洋瞎扑腾 从网上查了一些资料,一般都是下面这种说法: 看着步骤倒是也不算繁琐,可是本人照着步骤做了却没…

【imx6】Unable to find the ncurses libraries的解决办法

问题描述 在执行make menuconfig时,报错: Unable to find the ncurses libraries… 解决方法 安装ncurses和ncursesw库 sudo apt-get insatll ncurses-dev sudo apt-get insatll ncursesw-dev 注意:ncursesw库是ncurses的升级版本&#…

Elasticsearch6.1.3 for CRUD

为什么80%的码农都做不了架构师?>>> 一、创建文档 [root AOS2 AutoTest01:/root]#curl -X PUT 9.1.6.140:9200/students/class1/1?pretty -d > { > "first_name": "changwei", > "last_name": "…

指纹锁就安全了?防火防盗还得防AI

整理 | 一一 出品 | AI科技大本营(ID:rgznai100) 如何挑战百万年薪的人工智能 https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw 近日,你应该看到了社交媒体上对于网站 ThisPersonDoesNotExist.com,生成无数不存在人脸的铺天…

迪杰斯特拉算法(C语言实现)

迪杰斯特拉算法(C语言实现) 如上图,求以a为源点到个顶点的最短路劲。 #include "stdio.h"#include "stdlib.h"//用一个最大数表示顶点之间不相关#define MAX 999//设置顶点个数#define MAX_VERTEX_NUM 7//表示顶点之间不…

小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡

整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)昨晚,小米集团组织部下发正式文件,宣布了最新一轮组织架构调整,任命了崔宝秋为集团副总裁,集团技术委员会主席,并且在核心管理岗位上共任命了 14 …

【驱动】在内核源码中添加驱动程序

以wifi驱动(RTL8188EUS驱动)为例 添加源码 将源码rtl8188EUS添加到drivers/net/wireless/rtl818x/目录下 添加Kconfig 在drivers/net/wireless/rtl818x/rtl8188EUS添加Kconfig,内容如下: config RTL8188EUtristate "Realtek 8188E USB WiFi&qu…

怎么让wordpress用sqlite3 搭建轻量级博客系统

wordpress 默认是用mysql作为数据库支持,这个对个人站长来说还是有点麻烦了些。特别是如果以后网站备份迁移就有点事多了。 之前用django开发自己的博客感觉其实用sqlite3作为数据库插好,就是一个文件而已。备份网站,直接打包整个目录即可方便…

IBM蓝色基因/Q将采用NAND闪存存储

IBM将在计划中的高性能“怪兽”——蓝色基因/Q中采用NAND闪存存储。 这是一款采用水冷方式的高性能计算系统,IBM在近日的SC10大会上展示了其原型机的组件。 蓝色基因/Q将采用的闪存是来自SMART的XceedIOPS MLC NAND产品,它使用34nm制程工艺&…

全球超2万名开发者调研:Python 3渗透率至84%

编辑 | suiling 出品 | Python大本营(ID:pythonnews) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 在2018年秋季,Python软件基金会与JetBrains发起了年度Python…

【Qt】QWidget对样式表设置边框无效的解决方法

1、现象 在对QWidget使用样式表时无效 QWidget#MyWgt{border:1px solid gray; }2、原因 原因是QWidget只支持background、background-clip和background-origin属性。 3、解决方法 3.1 使用QFrame代替QWidget,QFrame继承自QWidget,并且带有框架属性 …

break continue

break 终止整个循环体,执行循环后的代码; continue 终止单次的循环,整个循环体还是会继续执行转载于:https://www.cnblogs.com/RonnieQin/p/8430783.html

CSSA email list

UCSD: cssamailman.ucsd.eduUChicago: cssalists.uchicago.edu 转载于:https://www.cnblogs.com/stoneresearch/archive/2010/11/30/4336484.html

LVS原理详解(3种工作方式8种调度算法)--老男孩

一、LVS原理详解(4种工作方式8种调度算法)集群简介集群就是一组独立的计算机,协同工作,对外提供服务。对客户端来说像是一台服务器提供服务。LVS在企业架构中的位置:以上的架构只是众多企业里面的一种而已。绿色的线就…

【Qt】QMainWindow最大化按钮是灰色(不能最大化)的解决方法

解决方法 设置最大尺寸为16777215,并且使能Qt::WindowMaximizeButtonHint(默认就是使能的,不执行也可以) const QSize MAIN_SIZE_MAX QSize(16777215, 16777215); this->setMaximumSize(MAIN_SIZE_MAX); this->setWindow…

“AI明星”地平线B轮融资6亿美元!

整理 | 一一 出品 | AI科技大本营(ID:rgznai100) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourcecxrs_bw 2 月 27 日,人工智能芯片技术的 AI 创业企业地平线(Horizon Robotics)宣布&a…

C++深拷贝与浅拷贝

浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可…

【OpenCV】使用过的函数汇总

1、类 Mat:矩阵matrix,opencv2中主要用来封装图片数据 InputArray:输入参数 ,约等于Mat OutputArray:输出参数,约等于Mat Rect:表示矩形 2、函数 imread();//从文件中读取图片到Mat中 imwrit…

春招来袭!程序员如何拿下硅谷顶级公司200万年薪?

还记得那个在去年,用 6 天时间参加了 LinkedIn、Yelp、Apple、亚马逊、Facebook 和 Google 的面试,并拿下了 6 份 Offer 的“别人家的程序员”吗?之后,他又在这几份工作中进行了选择,一步步谈下了 30 万美元&#xff0…

wake_lock_timeout的使用方法【转】

本文转载自:http://blog.csdn.net/liuxd3000/article/details/44224849 今天有用到用ec43_GPIO的中断来唤醒系统,将系统从深度休眠中唤醒并保证系统wakup 一段时间用过了,方法如下,有同样使用的童鞋可以参考一下!1. …

函数05 - 零基础入门学习C语言36

第七章:函数05 让编程改变世界 Change the world by program 函数的嵌套调用 嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义。 然而,C语言不能嵌套定义函数,但可以嵌套调用函数,…

【linux】可执行程序执行时报错-sh: ./mxc_v4l2_tvin.out: No such file or directory的解决方法

问题 在imx6开发板上执行 ./mxc_v4l2_tvin.out时报错: -sh: ./mxc_v4l2_tvin.out: No such file or directory 原因查找 1、路径问题:确定在当前目录下有该程序,没问题; 2、使用ls -l查看可以执行权限,没问题&…