如何查明子类是否覆盖了某个方法?
例如,
public class Test {
static public class B {
public String m() {return "From B";};
}
static public class B1 extends B {
}
static public class B2 extends B {
public String m() {return "from B2";};
}
/**
* @param args
* @throws FileNotFoundException
*/
public static void main(String[] args) {
B b1 = new B1();
System.out.println("b1 = " + b1.m());
B b2 = new B2();
System.out.println("b1 = " + b2.m());
}
}
Run Code Online (Sandbox Code Playgroud)
给定B的一个实例,我怎么知道任何派生类是否有像B2这样的重写方法m()?
更新:我的问题不明确.实际上,我试图在不诉诸反思的情况下询问是否可行.这种检查是在一个紧凑的循环中完成的,它用于性能破解以节省一些CPU周期.
我需要做一些处理来确定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) 我收到一个对象,需要记录它.他们中的一些有cusom toString()然后我想使用它,但有些没有,我得到类似的东西mightypork.rogue.bus.events.MouseMotionEvent@2d19587d.
我正在寻找一种动态的方法(也许用反射?)检查传入的对象是否已经toString()覆盖了自己.
String objToString(Object o)
{
if(???) {
return o.toString();
} else {
// fallback method
return o.getClass().getSimpleName();
}
}
Run Code Online (Sandbox Code Playgroud)
边注:
它是一个事件总线系统,有些类可以订阅,然后根据实现的接口接收事件.我不可能要求所有客户端都有toString(),而且我想使用这个方法来实现这个目的.