0

我正在开发的 java 库中使用 google Reflections。我使用 Reflections 的原因是因为我想找到所有带有特定注释的类。简化事情,在我的库中,我有一个回答这些类的方法,它通过如下行调用:

//this method uses the Reflections library
Repository.getDefault().getMyAnnotatedClasses()

在我的库的当前版本中,我要求用户在反射库需要查找带注释的类的位置显式添加包名称:

Repository.getDefault().addSearchPath("...");

通过这种方式,反射将查找仅位于该包中的类。

如果我的库的用户没有添加此搜索路径,我将反射配置为在系统类加载器中的所有类中搜索。显然,这种解决方案效率很低。但是,我真的想摆脱要求用户始终设置搜索路径的要求。- 如果它很重要,请注意:在反射中,您可以使用包名称、url(可以找到类的类路径)或类加载器配置搜索路径。

所以我的问题是:有没有办法找到调用我的库的类的类路径?(来自我的图书馆代码)。这样,我可以检测到如果用户没有明确设置搜索位置,我会默认添加该位置,这似乎比添加整个系统类加载器作为替代搜索路径更好的解决方案。

我知道我可以从我的库代码中手动检查方法调用堆栈,但这似乎有点笨拙和肮脏的解决方案,所以我正在寻找替代的想法。

提前致谢。

4

1 回答 1

0

您可以通过分析堆栈跟踪找到方法的调用者。虽然一般恕我直言不是一个好主意,因为它破坏了封装并且对托管环境(代理等)敏感,但它会起作用。多看这个问题

您还可以做什么,并避免每次扫描所有类路径的低效率,是在编译时使用反射扫描并保存一次,而不是在引导时收集它。

扫描并保存为 XML 一次:

new Reflections(...).save([somepath]);

而不是收集而不扫描:

Reflections reflections = Reflections.collect([somepath]);

如果您使用的是 Maven,您可以使用 Reflections-Maven 插件将其自动化并作为每个构建的一部分。

在 Reflections UseCases Wiki 页面中收集预扫描元数据的更多信息

于 2013-03-10T10:05:19.873 回答