Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
java控制台安全输入密码首选console.readpassword(),返回char[]并需立即清空;ide中system.console()常为null,应降级用scanner模拟掩码或引入jline库实现跨平台无回显输入。

Java 中控制台输入密码不回显,主要靠 Console 类的 readPassword() 方法实现。它会关闭回显、直接读取字符数组,安全且无需额外依赖。
使用 Console.readPassword()(推荐)
这是最简单、最标准的方式,适用于命令行环境(如终端、CMD、PowerShell),但注意:IDE 的控制台(如 IntelliJ 或 Eclipse 内置 Terminal)通常不支持 Console,运行时会返回 null,需加空值判断。
- 调用
System.console()获取 Console 实例;若为null,说明当前环境不支持,需降级处理(如提示用户改用其他方式或使用 Scanner + 警告) -
readPassword()返回char[],建议用完立即清空(Arrays.fill(pwd, '\0')),防止内存中残留明文 - 不能用于 GUI 或 Web 环境,仅限本地终端
Console console = System.console();<br>if (console != null) {<br> char[] pwd = console.readPassword("请输入密码: ");<br> // 使用后清空<br> Arrays.fill(pwd, '\0');<br>} else {<br> System.out.println("当前环境不支持安全输入,请谨慎操作");<br>}
兼容 IDE 的备选方案:用 Scanner + 退格模拟(简易版)
当 Console 不可用时(如在 IDE 中调试),可借助 Scanner 逐字符读取,手动处理退格(\b)、回车等,同时输出星号 * 占位。虽非真正隐藏,但能避免明文显示,适合开发调试阶段。
- 需监听
System.in.read()获取原始字节,区分普通字符、退格(ASCII 8)、回车(13/10) - 每次输入一个字符就打印一个
*,并用\r回到行首(需配合flush)保持光标位置自然 - 不保证跨平台完全一致(尤其 Windows/Linux 换行差异),慎用于生产
进阶:JLine 库(生产级推荐)
如果项目允许引入第三方库,JLine 3 提供了健壮的交互式控制台支持,包含真正的无回显密码输入、历史记录、自动补全等。
- Maven 引入:
<dependency><groupid>org.jline</groupid><artifactid>jline</artifactid><version>3.25.0</version></dependency>
- 代码简洁:
String pwd = terminal.read().readMaskedLine("密码: ");,自动处理平台差异和安全性 - 支持 ANSI、Windows 控制台、伪终端等多种环境,比原生
Console更可靠
注意事项与常见误区
- 别用 Scanner.nextLine() 直接读密码:会明文显示,完全不安全
-
String 存储密码是反模式:字符串不可变,无法及时擦除;始终优先用
char[],用完清零 -
GUI 场景请用 JPasswordField:Swing 中应使用
JPasswordField,而非普通文本框 - Web 场景由前端负责掩码:Java 后端只接收已提交的密码字符串,输入过程与后端无关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










