JPasswordField 中得到的字符数组转化为字符串(密码乱码问题)
转载自:http://blog.csdn.net/skl_tz/article/details/9009805
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());
原因如下:
这个是官方的源码:
- 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();
虽然这只是一个小小的问题,但是只有好好解决了诸多小问题,才能解决更多由小问题组成的大问题 ~ ~