JPasswordField 中得到的字符数组转化为字符串(密码乱码问题)

JPasswordField 用作密码的输入框,似乎很方便,但是,为了得到输入的内容,一般都会使用这样的方法去获取密码:

JPasswordField input_password = new JPasswordField(); 
String password = input_password.getPassword().toString(); 

JPasswordField input_password = new JPasswordField();
String password = input_password.getPassword().toString();

这种方法比较合乎常理,因为input_password.getPassword() 方法得到的是一个字符数组,然后我想要的是一个字符串,于是,第一观感应该就是 toString()方法了,但是不可否认的是,toString之后的结果是乱码 。

乱码的原因:如果看下源码就知道,这里的toString()方法是继承自其父类Object的,它并没有重写这个方法,而Object 中的 toString()方法只是单纯的将字符数组强制转化为字符串,因此出现了乱码。官方api中也描述了这个事实:

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

解决方案:

JPasswordField input_password = new JPasswordField(); 
String inputPassword = String.valueOf(input_password.getPassword()); 

JPasswordField input_password = new JPasswordField();
String inputPassword = String.valueOf(input_password.getPassword());使用String.valueOf( )

此方案可以有效的解决这个问题

原因如下:

这个是官方的源码:

public static String valueOf(char data[]) { 
    return new String(data); 
} 

public static String valueOf(char data[]) {
    return new String(data);
}

从源码中可以看到,实际上valueOf()方法是通过new 一个String 对象来完成转化的。

官方api 是这样解释new String(char data[ ])的:分配一个新的 String,使其表示字符数组参数中当前包含的字符序列,可以看到,new后的字符串实际是原来字符数组序列表示,这正是想要的结果。

也可用如下方式,效果是一样的,注意是TextField,而不是JTextField ,使用setEchoChar(‘*’) 方法和上面的方法没有本质区别:

?TextField input_password = new TextField(); 
input_password.setEchoChar('*'); 
String inputPassword = input_password.getText().trim(); 

 TextField input_password = new TextField();
 input_password.setEchoChar('*');
 String inputPassword = input_password.getText().trim();

虽然这只是一个小小的问题,但是只有好好解决了诸多小问题,才能解决更多由小问题组成的大问题 。

你可能感兴趣的:(乱码,JPasswordF)