level 1
我们都知道JDK1.4增加了java.util.prefs API可以借用注册表作为临时的数据存储媒介 可是美中不足的是使用prefsAPI只能读写HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs之下的键值而且一点卸载JDK我们存储的所有数据就全部丢失了长久以来java访问注册表只能借助JNI也就在一个星期前我就是这么做的结果被中文乱码整惨了...但是最近研读Preferences源码发现所有的注册表操作全部是调用一个叫做WindowsPreferences 的类WIN平台下所有的注册表操作均是借由此类而这个类在API中并没有开放(也许是出于安全考虑也许是为了保证跨平台)但是很庆幸java是开源的我们完全能看到源码既然源码都能看到了。。那还等什么 强制反射调用吧..这样一来就不依赖任何本地接口实现了注册表读写另外还找到一篇反射加JNI拿到JAVA窗体句柄交给C++操作的文章 个人感觉非常经典由于太长 一会我贴的我的空间
2008年03月22日 05点03分
1
level 1
顺带一提其实JDK中有相当多的类在API中没有开放所以..用反射可以使用很多目前版本API没有实现的功能
2008年03月22日 05点03分
2
level 1
http://hi.baidu.com/liyistudio/blog/item/0c8169392113e2f73a87ce0f.html得到Java程序的WIN32窗口句柄————————————顺便发一个无聊写的愚人节整人程序http://hi.baidu.com/liyistudio/blog/item/e3617495fbad784fd0135e21.html
2008年03月22日 05点03分
3
level 1
他那个修改注册表 好象只能修改特定分支下的以前我好象使来MS不能修改Local_Machine\...\CurrentVersion\run下面的能么?
2008年03月22日 08点03分
4
level 0
是我表达有问题吗....Preferences可以读写HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs之下的子键但是这个限制是人为加上的 只不过内部的处理机制被屏蔽了就像坐公交车 并不是车子只能走这条路线 而是SUN出于安全和跨平台考虑屏蔽了其他注册表操作但是只要顺着Preferences的源码顺藤摸瓜就能通过反射拿到具体的平台相关的注册表操作类WindowsPreferences 强制访问这个类的私有函数就能真正意义上实现纯java读写注册表2F我也说了 我们所看到的API文档所提供的编程接口只是JDK实现中的很少一部分 而更多API没有实现的功能完全可以在运行时通过反射来实现
2008年03月22日 08点03分
5
level 0
private static native int[] WindowsRegOpenKey(int hKey, byte[] subKey,124 int securityMask);125 /**126 * Retries RegOpenKey() MAX_ATTEMPTS times before giving up.127 */128 private static int[] WindowsRegOpenKey1(int hKey, byte[] subKey,129 int securityMask) {130 int[] result = WindowsRegOpenKey(hKey, subKey, securityMask);131 if (result[ERROR_CODE] == ERROR_SUCCESS) { 132 return result;133 } else if (result[ERROR_CODE] == ERROR_FILE_NOT_FOUND) {134 logger().warning("Trying to recreate Windows registry node " +135 byteArrayToString(subKey) + " at root 0x" + 136 Integer.toHexString(hKey) + ".");137 // Try recreation138 int handle = WindowsRegCreateKeyEx(hKey, subKey)[NATIVE_HANDLE];139 WindowsRegCloseKey(handle);140 return WindowsRegOpenKey(hKey, subKey, securityMask);141 } else if (result[ERROR_CODE] != ERROR_ACCESS_DENIED) {142 long sleepTime = INIT_SLEEP_TIME;143 for (int i = 0; i < MAX_ATTEMPTS; i++) {144 try {145 Thread.sleep(sleepTime);146 } catch(InterruptedException e) {147 return result;148 }149 sleepTime *= 2;150 result = WindowsRegOpenKey(hKey, subKey, securityMask);151 if (result[ERROR_CODE] == ERROR_SUCCESS) { 152 return result;153 }154 }155 }156 return result; 157 } 158 159 /** 160 * Java wrapper for Windows registry API RegCloseKey()161 */162 private static native int WindowsRegCloseKey(int hKey);163 164 /** 165 * Java wrapper for Windows registry API RegCreateKeyEx()166 */167 private static native int[] WindowsRegCreateKeyEx(int hKey, byte[] subKey);168 稍微发一段源码 应该能看明白了吧
2008年03月22日 08点03分
6
level 1
我终于明白你想说什么了 - -前面没看懂的原因之一就是我还不会使反射 - -
2008年03月22日 08点03分
7