【问题标题】:Finding classpath of class invoking a library查找调用库的类的类路径
【发布时间】:2012-04-10 17:00:10
【问题描述】:

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

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

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

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

这样,Reflection 将查找仅位于该包中的类。

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

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

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

提前致谢。

【问题讨论】:

    标签: java classloader reflections


    【解决方案1】:

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

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

    扫描一次并保存为 XML:

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

    比不扫描收集:

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

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

    在ReflectionsUseCases Wiki page收集预扫描的元数据查找更多信息@

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多