java.lang.NoSuchFieldError:句柄
我最近在EclipseSWTGUI应用程序中遇到了一个问题。我试图用以下代码获取窗口句柄:java.lang.NoSuchFieldError:句柄,java,eclipse,swt,window-handles,nosuchfieldexception,Java,Eclipse,Swt,Window Handles,Nosuchfieldexception,我最近在EclipseSWTGUI应用程序中遇到了一个问题。我试图用以下代码获取窗口句柄: Display.getDefault().syncExec(()->{ handle = Display.getDefault().getActiveShell().handle; }); 在我的64位Windows 10操作系统上运行良好 然后,当我在32位Windows机器上部署相同的应用程序(我在pc上使用Hyper-v设置的VM)时,会出现以下奇怪的
Display.getDefault().syncExec(()->{
handle = Display.getDefault().getActiveShell().handle;
});
在我的64位Windows 10操作系统上运行良好
然后,当我在32位Windows机器上部署相同的应用程序(我在pc上使用Hyper-v设置的VM)时,会出现以下奇怪的错误:
java.lang.NoSuchFieldError: handle
此句柄的文档说明:
long org.eclipse.swt.widgets.Control.handle
操作系统资源的句柄(警告:此字段取决于平台)
重要提示:此字段不是SWTpublic API的一部分。它被标记为public,这样它就可以在SWT提供的包中>共享。它不是在所有平台上都可用,并且永远不应从应用程序代码>访问
这可能是导致这个问题的原因吗
如果我们不能使用这个属性,有什么选择?我知道JNI/JNA处理本机代码,据我所知,它们仍然依赖SWT实现来获取句柄
谢谢你花时间回答我的问题
干杯 我本以为Javadoc会把情况说得非常清楚。不应使用SWT内部构件,它们在每个平台上完全不同(可能包括同一操作系统上的32/64位版本),甚至可能在不同版本之间发生变化 32位版本的Windows SWT确实有一个
句柄
字段,但在64位版本中它是int
而不是long
,这就是导致此错误的原因。其他平台的SWT根本没有句柄
字段
如果您真的必须访问这样的内容,那么您必须编写特定于每个平台/窗口系统/体系结构的代码。对于Eclipse插件,这可以通过平台特定的片段来完成。我想对于这种特殊情况,您也可以使用反射来查找int和long“handle”字段
还要注意,当前版本的Eclipse不再支持32位