查找调用库的类的类路径

时间:2012-04-10 17:00:10

标签: java classloader google-reflections

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

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

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

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

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

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

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

我知道我可以从我的库代码手动检查方法调用堆栈,但这似乎是一个黑客和肮脏的解决方案,所以我正在寻找其他想法。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以通过分析堆栈跟踪找到方法的调用方。虽然在一般IMHO中不是一个好主意,因为它打破了封装并对托管环境(代理等等)敏感,但它会起作用。在this question中查看更多内容。

你还能做什么,并且避免每次扫描所有类路径的效率低,就是在编译时用反射扫描并保存一次,然后在bootstrap时间收集它。

扫描并以XML格式保存一次:

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

而不是在没有扫描的情况下收集:

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

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

在反思UseCases Wiki page

中的收集预先扫描的元数据中寻找更多信息