最近看到一個問題,如何用Java實現從控制臺輸入密碼?
本來以為是很簡單的問題,查了一下發現Java居然沒提供這樣一個方法。目前實現的方式有2個,一個是利用JNI來調用C/C++方法,另一個是使用多線程。
下面是使用JNI的方法:
首先,寫出我們的Java類:

























這一段使用System.loadLiberary("..");來加載本地類庫,PasswordDLL是文件名,不需要加dll后綴,系統會自動辨認。
編譯成JNIPasswordReader.class以后,使用
javah -jni JNIPasswordReader
命令,生成一個JNIPasswordReader.h文件,文件內容如下:



























然后,我們需要寫一個cpp文件來實現
JNIEXPORT?jstring?JNICALL?Java_JNIPasswordReader_readPassword??(JNIEnv?*,?jobject);
接口。
于是,我寫了一個PasswordDLL.cpp文件,內容如下:





















































我使用VS2005來生成對應的dll文件,在生成之前,需要把$JDK_HOME/include/jni.h和$JDK_HOME/include/win32/jni_md.h這兩個文件copy到Microsoft Visio Studio 8/VC/include目錄下,我就在這里卡了大概1個小時,一直說找不到jni.h文件
然后就可以使用VS2005來生成dll了,生成好對應的PasswordDLL.dll以后,把該dll文件放到系統變量PATH能找到的地方,比如windows/system32/或者jdk/bin目錄,我是放到JDK_HOME/bin下面了
放好以后,
執行java JNIPasswordReader
就可以輸入密碼了。
關于JNI的更詳細內容,可以參考:
《在Windows中實現Java本地方法》http://www.ibm.com/developerworks/cn/java/jnimthds/index.html
我的Password.dll文件
http://www.aygfsteel.com/Files/richardeee/PasswordDLL.zip