Java:如何使用反射检查方法是否被覆盖

Ele*_*aar 5 java reflection overriding jsr330

我需要做一些处理来确定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;
}
Run Code Online (Sandbox Code Playgroud)

至于被覆盖的类似番石榴的谓词,我会检查:

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

对于层次结构中的方法数量,产生的复杂度为O(n ^ 2).

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

Kon*_*uda 1

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

继承树通常是由 IDE 构建的,但据我所知,它们对所有可用的源/类使用强索引(您可以查看 InteliiJ IDEA 社区编辑的源以获取线索)