在构建使用 OS.getRegOpenKey(...) 的 RCP 插件时,我需要同时针对 win32.x86 和 win32.x86_64 架构。两种架构的方法参数类型不同。
我现在明白,没有直接的方法可以让 x86 或 x86_64 片段(取决于构建)覆盖我的主机插件中的方法。
但是,从这篇文章中,听起来片段可以,例如,添加一个扩展主机中的类的类。然后主机插件可以显式地使用 ClassLoader 从该架构构建中包含的片段中查找并实例化正确的子类。这会是什么样子?
在构建使用 OS.getRegOpenKey(...) 的 RCP 插件时,我需要同时针对 win32.x86 和 win32.x86_64 架构。两种架构的方法参数类型不同。
我现在明白,没有直接的方法可以让 x86 或 x86_64 片段(取决于构建)覆盖我的主机插件中的方法。
但是,从这篇文章中,听起来片段可以,例如,添加一个扩展主机中的类的类。然后主机插件可以显式地使用 ClassLoader 从该架构构建中包含的片段中查找并实例化正确的子类。这会是什么样子?
根据链接到的帖子,这是我到目前为止所拥有的(现在两种架构都没有错误地构建,我只需要查看构建的 64 位应用程序是否可以在 64 位 Windows 上运行!):
使用 Eclipse 的片段插件向导来创建 x86 和 x86_64 片段。清单手动添加了几行额外的行。例如,x86_64 片段的 Manifest.mf 的重要位:
...
Bundle-SymbolicName: com.company.product.win32.x86_64;singleton:=true
Fragment-Host: com.company.product.win32;bundle-version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86_64))
Bundle-ClassPath: src/,.
然后,将子类添加到片段(使用与主机插件中的超类相同的包名,但这可能不是必需的):
package com.company.product.win32;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;
/**
* Subclass the host's abstract OSUtilities
*/
public class OSUtilities64 extends OSUtilities {
public String getRegKeyValue (String path, String key) {
long [] phkResult = new long [1];
if (OS.RegOpenKeyEx ((long) OS.HKEY_LOCAL_MACHINE, new TCHAR(0, path, true),
0, OS.KEY_READ, phkResult) != 0) {
...
OSUtilities32 类也是如此。
将片段添加到包含主机插件的 feature.xml 中:
<plugin
id="com.company.product.win32"
os="win32"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.company.product.win32.x86"
os="win32"
arch="x86"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
<plugin
id="com.company.product.win32.x86_64"
os="win32"
arch="x86_64"
download-size="0"
install-size="0"
version="0.0.0"
fragment="true"
unpack="false"/>
然后宿主插件可以静态加载适当的可用类:
/**
* Get class from appropriate fragment
*/
public static OSUtilities getOSUtilities() {
ClassLoader loader = OSUtilities.class.getClassLoader();
try {
Class<?> cls;
try {
cls = loader.loadClass("com.company.product.win32.OSUtilities32");
} catch (ClassNotFoundException e) {
cls = loader.loadClass("com.company.product.win32.OSUtilities64");
}
OSUtilities util = (OSUtilities) cls.newInstance();
return util;
我应该使用架构系统属性来选择要实例化的对象——稍后。