【问题标题】:Using Reflections for finding the (transitive) subtypes of a class when not all the types in the hierarchy are in the filtered classpath url当层次结构中并非所有类型都在过滤的类路径 url 中时,使用反射来查找类的(传递)子类型
【发布时间】:2012-10-06 17:07:15
【问题描述】:

我正在尝试使用Reflections 库来获取特定类的所有子类。我需要将搜索过滤到仅特定类路径 url 中的子类。 这是我正在使用的代码:

ConfigurationBuilder config = new ConfigurationBuilder();
config.addUrls(<my_url>);
Reflections reflections = new Reflections(config);
Set<Class<? extends A>> set = reflections.getSubTypesOf(A.class)

我的问题如下:假设 B 类扩展 A,C 类扩展 B。所以我们有:

A <|-- B <|-- C

A 和 B 位于与 C 不同的类路径 URL 中。给反射的 url 是 C 的 URL。然后我希望 C 在返回的集合中,并且 B 不应该存在,因为它在另一个类路径 url 中。

但是,返回的集合是空的。 C 不在反射返回的类集中,尽管它是 A 的传递后代。 如果我将 B 移动到 C 的相同类路径 URL,则返回 B 和 C。 然后我猜问题是如果层次结构中间的任何类不在过滤的url中,默认情况下反射不会回答(传递)子类。

我的问题是:我如何指示反射来回答特定类的(传递)子类,即使层次结构中间的某些类不在过滤的 url 中(但子类本身在过滤的 url 中) ?.

【问题讨论】:

    标签: java reflection classpath reflections


    【解决方案1】:

    关键是,如果不是所有相关的 url 都被扫描,传递性无法发现。你应该知道你的类路径。

    如果您不知道所有涉及的网址,您可以扫描所有网址,使用

    ClasspathHelper.forClassLoader()
    

    【讨论】:

    • 嗨@zapp,我事先不知道类路径的原因是因为我正在开发的是一个供第三方使用的库。我可以推断出调用我的库的代码的类路径(玩一点堆栈跟踪),所以我可以透明地将它添加到反射的搜索路径中,但我看不到包含所有相关类路径的简单方法需要对于我的图书馆的客户。我想我必须跟踪所有的网址,但这可能会对我的应用程序产生性能影响:(。无论如何感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多