这可能吗?
如果Class B
可以从Class A
分配,并且Method A
与Method B
具有相同的签名,我发现的唯一解决方案通常会将方法视为覆盖。但它并没有涵盖所有案例!
例如,我想处理这种情况:
interface Foo<T> {
void doStuff(T arg);
}
class FooImpl implements Foo<String> {
public void doStuff(String args) {
//Is overriden!
}
}
我还想检查Method B
实际上是否可见Method A
(包范围等)。
您是否曾经历过一种可靠的方法来确定方法是否被覆盖?
谢谢
答案 0 :(得分:4)
如果没有涉及泛型,则有existing answer来确定方法是否被覆盖。
由于type erasure,Java将完全删除泛型类型。所以字节码将是:
class FooImpl implements Foo<java.lang.String> {
FooImpl();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
public void doStuff(java.lang.String);
Code:
0: return
public void doStuff(java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #21 // class java/lang/String
5: invokevirtual #23 // Method doStuff:(Ljava/lang/String;)V
8: return
}
有两种doStuff方法。这是一个bridge method。它只是做类型转换并调用void doStuff(java.lang.String),所以实际上 void doStuff(java.lang.String)没有被覆盖,但 void doStuff(java.lang) .Object)。使用多态时,如:
Foo foo = new FooImpl();
foo.doStuff("ABC")
它实际上调用了void doStuff(java.lang.Object)。因此,如果您使用上面的链接来检测是否覆盖了void doStuff(java.lang.Object),它将报告是。
public static void main(java.lang.String[]);
Code:
0: new #1 // class FooImpl
3: dup
4: invokespecial #22 // Method "<init>":()V
7: astore_1
8: aload_1
9: ldc #23 // String ABC
11: invokeinterface #25, 2 // InterfaceMethod Foo.doStuff:(Ljava/lang/Object;)V
16: return