能否通过Groovy元编程阻止特定字符串变量被打印?
通过String.metaClass实现敏感字符串打印脱敏
要实现敏感字符串打印时被替换为*****,我们可以直接修改String类的元类,重写其toString方法——毕竟println本质上会调用对象的toString方法输出内容。
单敏感值场景实现
// 指定需要脱敏的敏感字符串 def targetSensitiveStr = "sensitiveValue" // 重写String的toString方法 String.metaClass.toString = { // 判断当前字符串是否为敏感值,是则返回*****,否则返回原内容 delegate == targetSensitiveStr ? "*****" : delegate } // 原业务代码 def sen = "sensitiveValue" def nonSen = "nonSensitiveValue" println sen println nonSen
运行这段代码后,输出就会符合预期:
***** nonSensitiveValue
多敏感值场景扩展
如果需要同时处理多个敏感字符串,可以把敏感值放到集合里,修改判断逻辑即可:
// 维护敏感字符串集合 def sensitiveList = ["sensitiveValue", "userPassword", "apiKey"] String.metaClass.toString = { delegate in sensitiveList ? "*****" : delegate } def sen = "sensitiveValue" def nonSen = "nonSensitiveValue" def secretKey = "apiKey" println sen println nonSen println secretKey
运行后输出:
***** nonSensitiveValue *****
注意事项
这种元类修改是全局生效的,意味着当前代码环境中所有String实例的toString都会遵循这个规则。如果只是需要局部脱敏,可能需要结合其他方式,但完全符合题目要求的String.metaClass实现方式。
内容的提问来源于stack exchange,提问作者try.aaam
相关产品推荐
相关产品推荐

