如何用Java实现从控制台输入密码?目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程。下面是使用JNI的方法:首先,写出我们的Java类:
public class JNIPasswordReader {
private native String readPassword();
static {
System.loadLibrary( " PasswordDLL " );
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JNIPasswordReader reader = new JNIPasswordReader();
String pwd = reader.readPassword();
System.out.println( " nYour Password is: " + pwd);
}
}
这一段使用System.loadLiberary("..");来加载本地类库,PasswordDLL是文件名,不需要加dll后缀,系统会自动辨认。
编译成JNIPasswordReader.class以后,使用 javah -jni JNIPasswordReader 命令,生成一个JNIPasswordReader.h文件,文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include < jni.h >
/* Header for class JNIPasswordReader */
#ifndef _Included_JNIPasswordReader
#define _Included_JNIPasswordReader
#ifdef __cplusplus
extern " C " {
#endif
/*
* Class: JNIPasswordReader
* Method: readPassword
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword
(JNIEnv * , jobject);
#ifdef __cplusplus
}
#endif
#endif
然后,写一个cpp文件来实现 JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword (JNIEnv *, jobject);接口。
写一个PasswordDLL.cpp文件,内容如下:
#include " JNIPasswordReader.h "
#include < iostream >
#include < iomanip >
#include < conio.h >
using namespace std;
JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword
(JNIEnv * env, jobject) {
char str[ 20 ] = { 0 } ;
jstring jstr;
char ch;
char * pstr = str;
while ( true )
{
ch = getch();
if (isdigit(ch) || isalpha(ch))
{
cout << " * " ;
* pstr ++ = ch;
}
else if (ch == ' b ' && pstr > str)
{
* ( -- pstr) = 0 ;
cout << " b b " ;
}
else if (ch == 0x0A || ch == 0x0D )
{
break ;
}
}
jstr = env -> NewStringUTF(str);
return jstr;
}
使用Visual c++6.0来生成对应的dll文件,在生成之前,需要把$JDK_HOME/include/jni.h和$JDK_HOME/include/win32/jni_md.h这两个文件copy到Microsoft Visual Studio/VC98/Include目录下
然后就可以生成dll了,生成好对应的PasswordDLL.dll以后,把该dll文件放到系统变量PATH能找到的地方,比如windows/system32/或者jdk/bin目录,我是在工作目录下建立一个dll目录,专门存放dll,并在系统变量path中配置好。下面了放好以后,执行java JNIPasswordReader 就可以输入密码了。运行结果如下所示
怎么样是不是很有意思,通过这个例子可以学习一下JNI的实现过程,当然本身这个例子也具有实际用处哦。如果你想象力够丰富的话…………。哈哈哈哈,不说了。说多了容易教坏人滴。哈哈哈