Eclipse plugin 特定于体系结构的Eclipse插件片段

Eclipse plugin 特定于体系结构的Eclipse插件片段,eclipse-plugin,eclipse-rcp,32bit-64bit,fragment,Eclipse Plugin,Eclipse Rcp,32bit 64bit,Fragment,在构建使用OS.getRegOpenKey(…)的RCP插件时,我需要同时针对win32.x86和win32.x86_64体系结构。对于这两种体系结构,方法的参数类型是不同的 我现在明白了,没有直接的方法可以让x86或x86_64片段(取决于构建)覆盖主机插件中的方法 然而,从这听起来像是一个片段,例如,可以添加一个类来扩展主机中的类。然后,宿主插件可以显式地使用类加载器从该体系结构的构建中包含的片段中查找并实例化正确的子类。这是什么样子的 根据链接到的帖子,这是我到目前为止所拥有的(两种体系结

在构建使用OS.getRegOpenKey(…)的RCP插件时,我需要同时针对win32.x86和win32.x86_64体系结构。对于这两种体系结构,方法的参数类型是不同的

我现在明白了,没有直接的方法可以让x86或x86_64片段(取决于构建)覆盖主机插件中的方法


然而,从这听起来像是一个片段,例如,可以添加一个类来扩展主机中的类。然后,宿主插件可以显式地使用类加载器从该体系结构的构建中包含的片段中查找并实例化正确的子类。这是什么样子的

根据链接到的帖子,这是我到目前为止所拥有的(两种体系结构的构建现在都没有错误,我只需要看看构建的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/,. 
然后,将子类添加到片段中(使用与主机插件中的超类相同的包名,但这可能不是必需的):

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;
/**
*从适当的片段获取类
*/
公共静态OSUtilities getOSUtilities(){
ClassLoader=OSUtilities.class.getClassLoader();
试一试{
cls类;
试一试{
cls=loader.loadClass(“com.company.product.win32.OSUtilities32”);
}catch(classnotfounde异常){
cls=loader.loadClass(“com.company.product.win32.OSUtilities64”);
}
OSUtilities util=(OSUtilities)cls.newInstance();
返回util;
我应该使用architecture系统属性选择要实例化的对象--稍后

/**
 * 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;