java修改static final String常量值

java修改static final String常量值

背景

在项目中使用的JPA,@Table设置实体类表名,使用mysql数据库的话,设置@Tablecatalogschema可以在生成查询sql时,加上schema。例如表为sys_node,库名叫stu_manage,设置schema=stu_managecatalog=stu_manage,sql就会变为select * from stu_manage.sys_node
项目现在要访问另一个库的表,但是这个库schema不是固定的要从配置文件中读取。

实现想法

  • 设置一个静态常量表示schema,静态常量通过@Value读取配置文件。
  • 只要动态改变@Tableschemacatalog,将上述常量赋值给schemacatalog
  • 想法很美好实现很残酷。

实现

  • 对于第一个想法代码如下,利用Spring组件注入的方式。
@Component
public class DataSchema{public static String schema = "";@Value("${data.schema}")public void setSchema(String schema){DataSchema.schema = schema;}
}

到这一步想着赋值给@Table属性schemacatalog不就好了。
结果发现,属性要求是 final变量。于是新问题又来了,怎么给static final String 变量改变值呢。
在研究之下有了如下的代码

@Component
public class DataSchema{public static  final String schema = (1=1?"":"");@Value("${data.schema}")public void setSchema(String schema){DataSchema.schema = schema;class<?> clas = DataSchema.class;try{Field field = cla.getDeclaredField("schema")//属性名称field.setAccessible(true);//用于去掉finalField modifiers = Field.class.getDeclaredField("modifiers");modifiers.setAccessible(true);modifiers.setInt(field,field.getModifiers() & ~Modifier.Final);field.set(null,schema)}catch(NoSuchFieldException e){throw new RuntimeException(e);}catch(IllegalAccessException e){throw new RuntimeException(e)}}
}

上述代码(1=1?"":"")不是无用代码,在jvm编译时,常量会直接替换使用方式。我的这种读取配置文件修改,那肯定是在类加载结束后才开始的。所以使用的地方值已经固定,就算我修改掉依然用不了。使用三元表达式Jvm加载时不会直接替换。

上述代码是实现了,从配置文件读取配置,然后修改静态final String变量。

但是@Table属性必须是已经确定的常量。。。也就是"xxxx"这种,这一下人都麻了,废了那么多功夫白做了。

于是有了下面的思想。

1、修改class文件。
这是理论,在类没有加载到jvm修改了class文件也可以实现动态改变值。但是。。。项目使用Apollo,配置文件也不是立马就有的。人又麻了。

2、修改已经加载到jvm中类常量。
没实现出来,资料太少。

最后

对不起各位,看了这么久,没有出现解决方案,最后我还是用sql拼接实现了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium自动化测试-3.元素定位(1)

这次我们要分享的是对元素的定位&#xff0c;在一个页面中有很多不同的策略来定位一个元素&#xff0c;我们选择最合适的方法即可。 一个页面最基本组成单元是元素&#xff0c;想要定位一个元素&#xff0c;我们需要特定的信息来说明这个元素的唯一特征。 selenium 主要提供了…

用java实现A*寻路算法

前言&#xff1a; 最近的开发中遇到了寻路这个知识点&#xff0c;然后去了解了一下最常见的A算法&#xff0c;本会会结合我的理解&#xff0c;用最通俗易懂的话语讲解A算法的原理&#xff0c;下面会给出代码示例。 说到寻路算法&#xff0c;就涉及到了图的遍历&#xff0c;然…

代码学习记录14

随想录日记part14 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.07 主要内容&#xff1a;今天的主要内容是二叉树的第三部分&#xff0c;主要涉及二叉树最大深度&#xff1b;二叉树最小深度&#xff1b;完全二叉树的节点个数。 104.二叉树的最大深度111.二…

Jmeter基础使用---Token鉴权接口关联

接口测试流程&#xff1a; 查看API接口文档&#xff0c;熟悉接口业务&#xff08;地址、端口、参数、鉴权、状态码&#xff09;设计接口测试用例&#xff08;正例&#xff1a;正确的结果&#xff1b;反例&#xff1a;鉴权异常、参数异常、兼容异常、其他异常&#xff09;使用接…

受投资人青睐,易鑫租赁深交所再发8.10亿ABS,利率再创新低

近日&#xff0c;上海易鑫融资租赁有限公司&#xff08;以下简称“易鑫租赁”&#xff09;成功发行“天风-易鑫租赁惠民4期资产支持专项计划”&#xff0c;募集资金8.10亿元&#xff08;人民币&#xff0c;下同&#xff09;。此次发行利率再创易鑫ABS历史新低。 2023年1月&…

windows安装程序无法将windows配置为此计算机

目录 问题描述 问题原因 解决办法 方法一 方法二 方法三&#xff1a; 问题描述 重装系统时显示windows安装程序无法将windows配置在此计算机硬件上. 问题原因 安装介质已损坏 如果可引导的安装介质&#xff08;如DVD或USB驱动器&#xff09;损坏或损坏&#xff0c;安装过…

算法-跳跃游戏 II

1、题目来源 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转…

17-Java解释器模式 ( Interpreter Pattern )

Java解释器模式 摘要实现范例 解释器模式&#xff08;Interpreter Pattern&#xff09;实现了一个表达式接口&#xff0c;该接口解释一个特定的上下文 这种模式被用在 SQL 解析、符号处理引擎等 解释器模式提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式 …

buildadmim生成代码时让菜单有层级

当我们使用buildadmin生成代码的时候&#xff0c;在菜单的部分&#xff0c; 有时希望它生的是一个带有层级的菜单&#xff0c;有时候则想生成一个没有层级的菜单 like this 经过本人测试 如果我们要生成没有层级的菜单 我们可以在高级设置中的 相对位置处更改&#xff0c;同时…

使用java批量写入环境变量

环境需求 jdk版本&#xff1a;1.8 jna依赖&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.10.0</version></dependency><dependency><groupId>net.java.…

少儿编程机器人软件的开发技术

在当今数字化时代&#xff0c;少儿编程教育备受关注&#xff0c;而机器人编程则是其中的一大热门领域。少儿编程机器人软件的开发技术既是挑战&#xff0c;也是机遇。本文将探讨少儿编程机器人软件的开发技术研究&#xff0c;以及实践中的关键问题与解决方案&#xff0c;为开发…

ServletContext

ServletContext 1.共享数据 ServletContext servletContext this.getServletContext(); String username "徐凤年"; servletContext.setAttribute("username",username);ServletContext servletContext this.getServletContext(); String username (…

因果学习篇(2)-Causal Attention for Vision-Language Tasks(文献阅读)

Causal Attention for Vision-Language Tasks 引言 这篇论文是南洋理工大学和澳大利亚莫纳什大学联合发表自2021年的CVPR顶会上的一篇文献&#xff0c;在当前流行的注意力机制中增加了因果推理算法&#xff0c;提出了一种新的注意力机制&#xff1a;因果注意力(CATT)&#xff…

Tongweb7+Tongweb8+Ths6.0.1.0+TongRDS2214 常用指令和初始账号密码(by lqw)

Tongweb7 启动 cd到安装目录的bin目录&#xff0c;执行&#xff1a; sh startservernohup.sh 或./startservernohup.sh 查看日志 cd到安装目录的logs目录&#xff0c;执行&#xff1a; tail -f server.log 关闭 cd到安装目录的bin目录&#xff0c;执行&#xff1a; ./stops…

航芯防护组合拳「MCU+安全」,让数字资产加倍安全!

在这个万物互联的时代&#xff0c;数据安全的“飓风”正在袭来。随着集成电路的广泛应用&#xff0c;安全问题也日益凸显。从芯片漏洞到硬件攻击&#xff0c;这些问题都给集成电路的应用带来了严峻的挑战。一旦安全防线被突破&#xff0c;智能设备的数字资产安全将面临威胁。 …

电动自行车易着火的启示

电动自行车起火情况不时发生&#xff0c;上海雷卯EMC小哥分析原因&#xff0c;或许对您有所启示。 电动自行车容易发生起火的原因可能是由于电池管理系统&#xff08;BMS&#xff09;的保护功能不足或者电池质量问题导致的。要改进BMS的保护功能以减少火灾风险&#xff0c; 可…

【CSP】201403-3-命令行选项

CSP-201403-3-命令行选项 关键点&#xff1a;将整行字符串按空格分割 在解析命令行时&#xff0c;一个常见的需求是将整个命令行字符串分割成多个部分&#xff0c;通常以空格为分隔符。这些部分包括命令行工具的名称、选项&#xff08;可能带有前缀-或--&#xff09;和这些选项…

【算法】KY111日期差值

描述 有两个日期&#xff0c;求两个日期之间的天数&#xff0c;如果两个日期是连续的我们规定他们之间的天数为两天 输入描述&#xff1a; 有多组数据&#xff0c;每组数据有两行&#xff0c;分别表示两个日期&#xff0c;形式为YYYYMMDD 输出描述&#xff1a; 每组数据输出一…

mongodb 图形界面工具 -- Studio 3T(下载、安装、连接mongodb数据库)

目录 mongodb 图形界面工具 -- Studio 3T下载安装第一次使用&#xff1a;注册添加一个连接&#xff08;连接 mongodb 数据库&#xff09;1、点击【添加新连接】&#xff0c;选择【手动配置我的连接设置】2、对 Server 设置连接数据3、连接的用户认证设置&#xff08;创建数据库…

SpringBoot + openGauss开发入门

本文介绍如何快速安装 openGauss 单机版 openGauss 快速环境安装 groupadd dbgroup useradd -g dbgroup omm # 可后面安装时创建 passwd omm #设置密码为Gauss_1234创建安装程序目标目录 mkdir /home/omm/opengauss3 chown -R omm:dbgroup /home/omm/opengauss3下载 openg…