在RCP应用程序中使用Reflection实现Annotation扫描的问题

时间:2012-11-09 13:40:09

标签: java eclipse-plugin eclipse-rcp google-reflections

我的第一次尝试是简单地将Jars包含在我的主应用程序中。 (Eclipse 3.7)我知道这是不赞成的,但我正在编写一个独立的专用应用程序,我并不太担心想要了解捆绑包。

尝试运行此操作:

 Reflections r = new Reflections("mypackage");

 Set<Class<?>> activeActions = r
                .getTypesAnnotatedWith(MyAnnotation.class);

在我的独立测试应用程序中,这工作正常,但在RCP中尝试时,我得到了以下输出:

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.

所以我四处寻找答案,发现This Question涵盖了我的问题,但没有给我足够的细节来解决它。作为第一步,我将反射包移出到一个包中,但是现在当我运行它时根本没有输出,我不知道这是因为log4j路径不好还是什么,但我现在没有反思包的反馈。

我的activeActions列表是空的,所以扫描没有用(我没想到)因为我没有实现解决方案的第二部分,即创建 自定义UrlType。但是我现在已经实现了自定义URL类型,但仍然没有找到任何内容,我不知道为什么因为我可以看到来自Reflections包的任何反馈,它只是找不到任何东西。

我希望有人可以帮助我让Reflections记录工作,然后找出为什么UrlType解决方案不适合我。

修改

这是一个笑话,如果我不打扰Bundle,我只是将反射罐推入我的类路径扫描工作,只要注册了自定义UrlType。记录一切正常。我为什么要打扰Bundles?

1 个答案:

答案 0 :(得分:0)

看起来像OSGI框架下的类加载问题。你必须记住,每个bundle / plugin都维护着自己的类加载器,所以我认为你正在使用错误的类加载器加载你的类和资源正在发生的事情没有得到解决。首先在OSGI中加载类,这是建议的方法:

通过执行此Platform.getBundle(“com.mybundle.id”)获取包含您的类的Bundle / Plugin; 在bundle实例上有一个名为.loadClass(String class)的方法;

尝试使用我刚刚提到的方法加载MyAnnotation.class,看看会发生什么。您引用的帖子中的eclipse buddy-register功能对于在OSGI下使用hibernate这样的事情非常有用,你在你的bundle中映射数据类,默认情况下hibernate使用Class.forname()来加载类,它会遇到错误,因为映射类不在hibernate lib bundle的类路径上。将hibernate插件的依赖添加到bundle是没有意义的,所以在hibernate bundle的清单中你设置eclipse-buddy-policy:注册(在确切的语法上不正确)然后在你的包中使用映射的类注册hibernate as一个伙伴,在运行时,hibernate类加载器将在其类路径中包含所有类。

希望这能让您了解类加载,这似乎是个问题。尝试从捆绑实例加​​载您的类not = new()。