我需要做一些处理,以使用反射来确定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;
}
对于被覆盖的类似番石榴的谓词,我会检查:
关于层次结构中方法的数量,产生的复杂度为O(n ^ 2)。
我想知道是否有更简单或更有效的方法来实现它,或者任何具有此类功能的库。我在Guava和Apache Commons中看起来都没有成功......
答案 0 :(得分:1)
不幸的是,类图只能在根方向导航 - 因此除了检查某些类加载器可用的所有类之外,无法找到所有派生类。 IoC容器没有这个问题,因为它们总是知道具体的实现 (这是配置的一部分)
继承树通常由IDE构建,但是AFAIUK它们对所有可用的源/类使用brite force索引(您可以查看InteliiJ IDEA的社区editio的来源以获取线索)