栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Eclipse插件中使用反射库时不起作用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Eclipse插件中使用反射库时不起作用

我假设您已经知道如何创建包(否则,请检查此)。

经过对Reflections API的调试和探索之后,我意识到问题是Reflections根本无法读取OSGi URL(bundleresource://
…),从而导致异常:

org.reflections.ReflectionsException: could not create Vfs.Dir from url, no matching UrlType was found [bundleresource://1009.fwk651584550/]

和这个建议:

either use fromURL(final URL url, final List<UrlType> urlTypes) or use the static setDefaultURLTypes(final List<UrlType> urlTypes) or addDefaultURLTypes(UrlType urlType) with your specialized UrlType.

因此,我相信为OSGi实现UrlType(例如

class BundleUrlType implements UrlType {...}
)并像这样注册它:

Vfs.addDefaultURLTypes(new BundleUrlType());

应该从捆绑包内部使Reflections API可用。描述思考的依赖应该被添加到Eclipse插件项目
在这里

这是添加所需罐子后的示例MANIFEST.MF的样子:

Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: ReflectivePluginBundle-SymbolicName: ReflectivePluginBundle-Version: 1.0.0.qualifierBundle-Activator: reflectiveplugin.ActivatorBundle-ActivationPolicy: lazyBundle-RequiredExecutionEnvironment: JavaSE-1.6import-Package: javax.annotation;version="1.0.0", org.osgi.framework;version="1.3.0", org.osgi.service.log;version="1.3", org.osgi.util.tracker;version="1.3.1"Bundle-ClassPath: ., lib/dom4j-1.6.1.jar, lib/guava-r08.jar, lib/javassist-3.12.1.GA.jar, lib/reflections-0.9.5.jar, lib/slf4j-api-1.6.1.jar, lib/xml-apis-1.0.b2.jarExport-Package: reflectiveplugin,  reflectiveplugin.data

注意:Used Reflections v。0.9.5

这是一个示例UrlType实现:

package reflectiveplugin;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.util.Enumeration;import java.util.Iterator;import org.osgi.framework.Bundle;import org.reflections.vfs.Vfs;import org.reflections.vfs.Vfs.Dir;import org.reflections.vfs.Vfs.File;import org.reflections.vfs.Vfs.UrlType;import com.google.common.collect.AbstractIterator;public class BundleUrlType implements UrlType {    public static final String BUNDLE_PROTOCOL = "bundleresource";    private final Bundle bundle;    public BundleUrlType(Bundle bundle) {        this.bundle = bundle;    }    @Override    public boolean matches(URL url) {        return BUNDLE_PROTOCOL.equals(url.getProtocol());    }    @Override    public Dir createDir(URL url) {        return new BundleDir(bundle, url);    }    public class BundleDir implements Dir {        private String path;        private final Bundle bundle;        public BundleDir(Bundle bundle, URL url) { this(bundle, url.getPath());        }        public BundleDir(Bundle bundle, String p) { this.bundle = bundle; this.path = p; if (path.startsWith(BUNDLE_PROTOCOL + ":")) {      path = path.substring((BUNDLE_PROTOCOL + ":").length());  }        }        @Override        public String getPath() { return path;        }        @Override        public Iterable<File> getFiles() { return new Iterable<Vfs.File>() {     public Iterator<Vfs.File> iterator() {         return new AbstractIterator<Vfs.File>() {  final Enumeration<URL> entries = bundle.findEntries(path, "*.class", true);  protected Vfs.File computeNext() {      return entries.hasMoreElements() ? new BundleFile(BundleDir.this, entries.nextElement()) : endOfData();  }         };     } };        }        @Override        public void close() { }    }    public class BundleFile implements File {        private final BundleDir dir;        private final String name;        private final URL url;        public BundleFile(BundleDir dir, URL url) { this.dir = dir; this.url = url; String path = url.getFile(); this.name = path.substring(path.lastIndexOf("/") + 1);        }        @Override        public String getName() { return name;        }        @Override        public String getRelativePath() { return getFullPath().substring(dir.getPath().length());        }        @Override        public String getFullPath() { return url.getFile();        }        @Override        public InputStream openInputStream() throws IOException { return url.openStream();        }    }}

这就是我在Activator类中创建反射的方法:

private Reflections createReflections(Bundle bundle) {    Vfs.addDefaultURLTypes(new BundleUrlType(bundle));    Reflections reflections = new Reflections(new Object[] { "reflectiveplugin.data" });    return reflections;}

最后一点非常令人困惑,但仍然很重要:如果您在Eclipse(运行方式为/ OSGi
framework)中运行插件,则还必须将类输出目录添加到Reflections路径模式(即“ bin”或“ target / classes”)
”)。但是,对于已发布的插件,不需要(要构建插件/捆绑,请执行“导出”->“可部署的插件和片段”)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号