【问题标题】:Java: How to check if a method is overridden, using reflectionJava:如何使用反射检查方法是否被覆盖
【发布时间】:2012-03-29 04:38:07
【问题描述】:

我需要做一些处理来确定 JSR-330 注释类的依赖关系,使用反射。

我完全了解所有符合 JSR-330 的 IoC 容器,例如 Spring、Guice 或 PicoContainer。但是,我需要的不是解析和注入依赖,而是识别它们。

这基本上意味着我需要实现 JSR-330 实现,至少在反射类“解析”方面是这样。

JSR-330 规范的一部分我觉得实施起来有点麻烦:

使用@Inject 注解的方法覆盖另一个方法 使用 @Inject 注释的每次注入只会注入一次 每个实例的请求。没有 @Inject 注释的方法 覆盖带有@Inject 注解的方法不会被注入。

这意味着子类可以重新定义其基类的自动装配合同,以及挂钩到注入流(通过多态性)。

我的问题来了:给定一个类层次结构,有没有一种简单的方法可以检查层次结构中某个部分的方法是否被进一步覆盖?

在我的例子中,最简单的方法是从层次结构的叶子递归:

private List<Method> getInjectableMethods(final Class<?> clazz) {
    // recursive stop condition
    if(clazz == null) {
        return emptyList();
    }

    // recursively get injectable methods from superclass
    final List<Method> allInjectableMethods = newLinkedList(getInjectableMethods(clazz.getSuperclass()));
    final List<Method> injectableMethods = newArrayList();

    // any overridden method will be present in the final list only if it is injectable in clazz
    for (final Method method : clazz.getDeclaredMethods()) {
        removeIf(allInjectableMethods, Methods.Predicates.overriddenBy(method));
        if (isInjectable(method)) {
            injectableMethods.add(method);
        }
    }
    allInjectableMethods.addAll(injectableMethods);

    return allInjectableMethods;
}

至于overriddenBy Guava-like Predicate,我会检查:

  • 定义类的方法位于 isAssignableFrom 关系中
  • 方法名称相同
  • 方法形式参数相同

相对于层次结构中的方法数量,得到的复杂度为 O(n^2)。

我想知道是否有一些更简单或更有效的方法来实现它,或者任何具有此类功能的库。我在 Guava 和 Apache Commons 中都没有成功...

【问题讨论】:

  • 谷歌思考可能吗? code.google.com/p/reflections
  • 我查看了 javadocs 并没有找到任何用于检查方法覆盖的内容。不过图书馆不错,我会记住的!
  • 在最坏的情况下,它会让你的算法更容易实现。 :)
  • 您可能想阅读以下内容:stackoverflow.com/a/2315467/44522。还要检查这个答案:stackoverflow.com/a/4821892/44522。使用第一个答案,您可以在 O(n) 时间内从叶子向上构建覆盖树,因为您只需检查每个方法一次。

标签: java reflection overriding jsr330


【解决方案1】:

不幸的是,类图只能在根方向导航 - 所以除了检查某些类加载器可用的所有类之外,没有办法找到所有派生类。 IoC容器没有这个问题,因为它们总是知道具体的实现 (它是配置的一部分)

继承树通常由 IDE 构建,但 AFAIUK 对所有可用的源/类使用强力索引(您可以查看 InteliiJ IDEA 社区版的源以获取线索)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2015-08-29
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多