Java的private和final字段竟然可以被外部类修改?

Spring + Lombok:为何 private final 字段无需 @Autowired?核心结论与完整机制解析 在 Spring 框架中,使用 @RequiredArgsConstructor 注解结合 private final 字段实现依赖注入,依赖于 Lombok 生成全参构造器和 Spring 的隐式构造器注入机制。Lombok 在编译时为所有 final 字段生成构造器,而 Spring 4.3+ 版本默认将唯一有参构造器作为依赖注入入口,通过类型或名称匹配容器中的 Bean 完成自动装配。这种方式代码简洁、线程安全且框架耦合性低,适用于无循环依赖、字段需强制初始化的场景。然而,需注意版本兼容性、依赖匹配问 阅读详情

一、前言

今天在阅读源码的时候无意中发现被private修饰的变量竟然可以被外部类访问,不仅如此,final声明的变量在某种情况下还可以被修改。这种打破常规的操作就是用到神奇的反射。

二、演示


1、访问并修改private修饰的字段


将被外部修改的类

public class Person {

	private String name = "zhangsan";
	
	public String getName() {
		return name;
	}
	
}




通过反射去修改外部类的private字段
public class Main {

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		
		Person person = new Person();
		String curName = person.getName();
		System.out.println("修改前的name:"+curName);
		Field field = Person.class.getDeclaredField("name");//通过反射获取name字段
		field.setAccessible(true);   //这一步是关键,将访问name字段的权限打开
		field.set(person, "lisi");   //修改被private修饰的name
		String afterName = person.getName();
		System.out.println("修改后的name:"+afterName);
		
	}
	

}


运行结果



2、修改被final修饰的字段


被修改的类
public class Person {

	final String sex;
	
	public Person() {
		this.sex = "男";
	}
	
}




修改final字段的主类
public class Main {

	public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		
		Person person = new Person();
		String curSex = person.sex;
		System.out.println("修改前的sex:"+curSex);
		Field field = Person.class.getDeclaredField("sex");//通过反射获取sex字段
		field.setAccessible(true);   
		field.set(person, "女");   //修改被final修饰的sex
		String afterSex = person.sex;
		System.out.println("修改后的sex:"+afterSex);
		
	}
	

}


运行结果




注:如果final修饰的字段已经被初始化了,则不能通过反射去修改该字段。如Person类为以下的时候
public class Person {

	final String sex = "男";
	
}











【Musescore 】开源打谱软件 快速入门笔记 前两天做了个西贝柳斯的打谱软件学习笔记,反正都是初学,今天再来学习一款同类软件,比较之后确定一款深入学习。 西贝柳斯的学习笔记在此:https://blog.youkuaiyun.com/yuetaope/article/details/120020342 西贝柳斯是商业收费软件,要么花钱,要么盗版,如果您觉得这两者都不大好,那么推荐您试试Musescore。 Musescore是一款非常优秀的开源的打谱软件,生态繁荣。“开源”和“生态”是码农业的术语,我用正常人类的语言简单解释一下。 开源就是开放程序源代码,对码农 阅读详情

相关推荐

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

【引用返回与值返回】私有数据成员在外部如何进行修改

没有确定的内存单元,不能放在赋值号左边,只能作为右值,而。在public内写getI(),获得m_i,主函数内调用。好处是返回时本身且不可被修改,仅是引用时才有意义。问:为什么需要返回引用,不能返回值呢?问:如何优化代码,使返回值不可被修改?,不是临时变量,可以作为左值被修改。答:返回如下const的引用类型。

qq_53830608的博客 509

Fortigate 在AWS中配置HA

方案1: 1、将两台服务器配置在相同可用区中,使用飞塔原生HA功能,可以实现配置同步功能。 2、配置SSLVPN,在主服务器不可用时,可以实现自动切换到备用服务器继续提供VPN服务。 当前问题: 1、主挂掉后可以自动切换到备,但是原主服务器修复后不会自动切换到主状态。 2、如下图所示切换中丢包明显,需要客户端开启“保持连接”功能。 配置过程如下: 1、整体架构 2、创建VPC和子网,如下图所示...

子苏蓝莓的博客 891

java面试题之修改private属性成员变量

ok,虽然没有set接口,那么我们就想到用反射技术来获取这个类的Class对象,然后在来获取私有成员变量,在利用set方法,把这个值修改成自己想要的。一般来说,成员变量都是用private来修饰,也就是说外部是访问不了的,无法直接修改,一般就是提供set与get接口来进行访问,比如下面这样。但是假如没有set这样一个外部接口的类呢,又改如何修改呢?或者说能不能修改呢,把类做如下修改。上面就是利用set来进行年龄的修改。...

Pxx520Tangtian的博客 2220

深入解析ChangeFormer:基于Transformer的孪生网络在遥感变化检测中的创新应用

本文深入解析了ChangeFormer这一基于Transformer的孪生网络在遥感变化检测中的创新应用。通过分层Transformer编码器、特征差异计算模块和轻量级MLP解码器的设计,ChangeFormer在LEVIR-CD数据集上取得了90.4%的F1分数,显著优于传统卷积网络。文章还详细探讨了工程化实现、训练调参和模型部署的优化策略,为遥感变化检测领域提供了新的技术范式。

weixin_29051811的博客 731

基于卷积神经网络的人脸识别算法

摘要:近年来,随着科学技术的不断发展,人脸识别技术日渐成熟,使得人脸识别技术的使用率不断增大。例如:门禁、ATM机、公安系统以及新兴起的人机交互等领域,都应用到了人脸识别系统。在人脸识别研究领域中,深度学习扮演着重要的角色。由于深度学习的人脸识别技术凭借其识别率高、识别快等特点,逐渐成为整个领域的主流技术。在众多深度学习算法中,以卷积神经网络为代表的人脸识别系统得到了广泛应用,主要研究内容如下:首先,通过对经典损失函数进行研究,对比每种损失函数的特点,然后根据A-Softmax函数进行改进,借助Margin

yyq2263511327的博客 1万+

JAVA通过反射机制访问/修改私有变量、方法(实现在其它类中访问/修改对象的私有变量、方法)

平常访问/修改类对象的私有属性,需要使用gei/set方法访问,这里我们也可以通过反射机制直接访问/修改

weder的博客 8182

dos攻击 --hping3

dos使用hping3攻击

qq_65880213的博客 2745

创建一个类的实例,修改类中定义为private的变量的值

import java.lang.reflect.*;/** * public class ReadOnlyClass{ * private String name = "hello"; * public String getName(){ * return name; * } *创建ReadOnly的实例,能否将name的值改为world *可以

u010604293的博客 1167

8、音频运行时系统的架构设计

本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。

juice的博客 461

PMP--二模--解题--161-170

A:邀请团队成员在下一次回顾中分享经验。B:请求发起人增加具有所需经验的团队成员。C:在团队内计划知识共享会议。D:请求发起人为团队提供培训课程。A。

stqer的博客 1268

String 被final修饰 为字符串常量,为什么可以被修改?

public static void main(String[] args) { String a = "abc"; System.out.println(a); a = "dfg"; System.out.println(a); } 结果: abc dfg a只是String对象的一个引用并不上对象本身,当执行a = "dfg"时创建了新的对象,原来的“abc”还存在于内存中,只是a的引用对象地址发生了变化 ...

zhang2383906154的博客 1466

Python入门实战:Python生物信息学编程基础

本文旨在为生物学背景的研究人员和对生物信息学感兴趣的程序员提供一个全面的Python生物信息学编程入门指南。我们将从Python基础知识开始,逐步深入到生物信息学特定的工具和技术,最终达到能够独立开发生物信息学分析程序的水平。Python编程基础生物信息学常用数据结构和算法DNA和蛋白质序列分析基因组数据处理生物信息学数据可视化Biopython库的使用实际项目案例背景介绍:概述文章目的、范围和预期读者核心概念与联系:介绍Python和生物信息学的基本概念。

AI架构师小马 1508

匿名内部类引用外部类对象是可以的且并不一定需要final及内部类引用外部类为私有时编译器会为其开“后门”

public class test { private static String userName = "磊哥"; public static void main(String[] args){ String a = "23"; Map<String, String> map = new HashMap() {{ put("map1", "value1"); put("map2", "val

cc1aymore的博客 906

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java修改字段修饰符_Java反射-修改字段值, 反射修改static final修饰的字段

反射修改字段咱们从最简单的例子到难, 一步一步深入.使用反射修改一个private修饰符的变量name咱们回到主题, 先用反射来实现一个最基础的功能吧.其中待获取的name如下:public class Pojo {private StringBuilder name = new StringBuilder("default");public void printName() {System.ou...

weixin_42464967的博客 365

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

javabean反射改字段内容_Java反射-修改字段值, 反射修改static final修饰的字段

反射修改字段咱们从最简单的例子到难, 一步一步深入.使用反射修改一个private修饰符的变量name咱们回到主题, 先用反射来实现一个最基础的功能吧.其中待获取的name如下:public class Pojo {private StringBuilder name = new StringBuilder("default");public void printName() {System.ou...

weixin_39635459的博客 286

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JAVA反射修改private,final的值

JAVA通过反射修改private,final的值 以下是两个类,我们需要对他的值进行修改 class PrivateName { private String name = "init"; public String getName() { return name; } } class FinalName { public final...

yhd723948277的博客 2863

private static final 修饰符

java修饰符分类修饰符字段修饰符方法修饰符根据功能同主要分下几种 1、权限访问修饰符 public,protected,default,private,四种级别修饰符都用来修饰类、方法和字段 包外 子类 包内 类内 public yes yes y

JAVA之迷 1311

Java小白必看:final字段为什么不能修改?

今天在学Java的时候遇到了一个很有意思的问题,和大家分享一下关于final字段的那些事儿。作为一个刚入门的小白,看到"UNABLE TO MAKE FIELD PRIVATE FINAL JAVA.LANG.STRING JAVA.IO.FILE.PATH ACCESS"这样的错误提示时,真的是一头雾水。对于新手来说,不用配置复杂的开发环境就能验证想法,遇到问题也能快速修改重试,学习曲线平缓多了。想象final修饰的变量就像用刻刀在石头上刻的字,一旦刻上去就不能修改了。性能优化:编译器可以做更多优化。

OnyxPanther23的博客 758

java final修改器_使用Java反射更改私有静态最终字段

假设不SecurityManager阻止你这样做,你可以用setAccessible四处走动private并重置修改器以消除final,并实际修改private static final场。下面是一个例子:importjava.lang.reflect.*;publicclassEverythingIsTrue{staticvoidsetFinalStatic(Fieldfield,...

weixin_39517202的博客 283

java static 修改_java修改static final常量值

public class EverythingIsTrue {static void setFinalStatic(Field field, Object newValue) throws Exception {field.setAccessible(true);Field modifiersField = Field.class.getDeclaredField("modifiers");mod...

weixin_32256355的博客 1484

【Java】private、protected、public、default、final、static的解释及区别

最近做一些线上开发,使用java语言,代码写着写着脑子中有点凌乱,一、本身对这些关键字并不是铭记于心;二、写代码一般都是复制粘贴复制粘贴,自己写的并不是很多,基本上按照自己的逻辑编写时,相关变量已经有前人给你定义好了,你换个名字就可以使用了,导致我退化了这些基本知识技能,本就没内化于心,更别说外化于行了。哎,拿着电脑去问一个同事,同事问:你没写过吗?这句话激励了我是时候总结总结,并温故知新了。 ...

凝眸伏笔的博客 1979

Java中常见的修饰符(public,private,static,final,abstract)

修饰符 可分为访问修饰符和其它修饰符 访问修饰符 public:用public 修饰的类则该类可以被其它类访问,若该类是使用默认的修饰符,则该类只能被同包中的类访问。 private:更好的封装和隐藏,外部类不能随意存取和修改。 其它修饰符 static 1、static字段: 静态字段最本质的特点是类的字段,不属于任何一个对象的实例。 它不保存在某个对象实例的内存区间中,而是保存在类的公共存储单元中。 类变量可以通过类名直接访问,也可通过实例对象来访问。 static在一定意义上可以用来

code_change_era的博客 2164

Java学习笔记(二)private、protected、public、默认、static、final、abstract修饰符

一、修饰符 1.访问修饰符(access modifiers),如public/private等 成员的访问控制符 同一个类中 同一个包中 不同包中的子类 不同包中的非子类 private yes 默认(包可访问) yes yes protected yes yes ...

weixin_38987137的博客 1310

【java前端课堂】01_final和private的区别

在Java中,我们使用final来限制一个类不被其他类继承,这是为了确保类的实现不会被修改或破坏。而private是用来限制类的成员(包括字段、方法和内部类)的访问权限,确保它们只能在类内部被访问,而不能从类的外部访问。下面是这两个关键字的简单总结:final用于类:表示这个类不能被继承。private用于类的成员:表示这个成员只能在类内部被访问。

weixin_56334307的博客 664

java入门, private static final

在定义一个变量是使用private static final 修饰,我们知道,内容就可更改了。这种场景用的最多的是在一些工具类中,对一些参数的设定。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1021
上一篇: git log统计每个作者的代码量
下一篇: ReentrantLock原理浅析
ZengBlog
博客等级 码龄10年 29粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值