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

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


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());
使用 String.valueOf( )可以有效的解决这个问题

原因如下

这个是官方的源码:

    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();


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





你可能感兴趣的:(JPasswordField,字符数组转化为字符串,密码乱码)