有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么JPasswordField中的getText()被弃用?

我以前从来没有想过,只是我使用了getPassword方法返回一个字符数组,我看到getText方法已被弃用。但是现在我想,为什么这个方法被弃用呢

Java文档解释了:

Deprecated. As of Java 2 platform v1.2, replaced by getPassword.

Fetches a portion of the text represented by the component. Returns an empty string if length is 0.

For security reasons, this method is deprecated. Use the getPassword method instead.

但这些安全原因是什么呢?有什么想法吗

提前谢谢你


共 (3) 个答案

  1. # 1 楼答案

    当调用getText时,您会得到一个可能不会更改的字符串(不可变对象)(反射除外),因此密码会一直保留在内存中,直到垃圾被回收

    当调用getPassword时,您会得到一个可以修改的字符数组,因此密码实际上不会留在内存中

  2. # 2 楼答案

    • getText()返回一个字符串,因此该字符串被添加(作为标准Java行为)到字符串池中。字符串池由垃圾回收器清理,但只有在垃圾回收器动作时(而且不能按需)。因此,即使不需要密码,密码也可以保留在池中,并且可以被其他Java进程读取

    • getPassword()返回一个字符数组。这些不是字符串,而是数组对象,因此尽管垃圾收集器需要时也会删除它们,但它们不会保留在任何池中,并且其他java进程无法访问它们

    但是您必须小心如何使用getPassword()读取的字符数组,因为如果我们将其转换为字符串,它就会进入池中,这就像我们使用getText()一样糟糕

  3. # 3 楼答案

    原因是,如果您以字符串而不是字符数组的形式请求密码,那么包含密码的字符串现在将在Java运行时的内存中浮动一段未指定的时间。可以想象,它可以由恶意Java组件或外部程序从那里读取

    通过使用字符数组,您可以验证密码,然后立即将其置乱