Java:如何查找是否从基类重写了一个方法?
作者:互联网
参见英文答案 > How to quickly determine if a method is overridden in Java 8个
如何查明子类是否覆盖了某个方法?
例如,
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());
}
}
给定B的一个实例,我怎么知道任何派生类是否有像B2这样的重写方法m()?
更新:我的问题不明确.实际上,我试图在不诉诸反思的情况下询问是否可行.这种检查是在一个紧凑的循环中完成的,它用于性能破解以节省一些CPU周期.
解决方法:
我认为到目前为止的答案是假设你有一个方法,并试图确定是否在类中重写该方法.
但是,问的实际问题是“给定B的实例,我如何知道任何派生类是否已经覆盖了方法m(),如B2?”
使用标准Java方法是不可能的,因为Java在引用之前不会加载类.例如,假设您从网络上的jar(或许多jar)加载了URL类加载器. Java不知道那些联网的jar文件中包含哪些类,更不用说它们是否碰巧覆盖了特定的方法.
我认为我已经看到Apache公共中的实用程序会尝试详尽地搜索类加载器的层次结构来组合所有可用类的列表,但这听起来对我来说是一个非常糟糕的主意.首先,它将为JVM中的每个类触发每个静态初始化程序块.
有一些设施,比如服务提供者接口,可以在jar的META-INF目录中列出实现某个接口的类名,也许您应该查看该路由.
标签:java,inheritance,methods,introspection,overriding 来源: https://codeday.me/bug/20190926/1819436.html