确定方法是否使用反射覆盖另一个方法?

Sim*_* V. 10 java reflection

这可能吗?

我发现的唯一解决方案通常将方法视为重写,如果Class B可以分配,Class A并且if Method A具有相同的签名Method B.但它并不涵盖所有情况!

例如,我想处理这种情况:

interface Foo<T> {
    void doStuff(T arg);    
}

class FooImpl implements Foo<String> {
    public void doStuff(String args) {
        //Is overriden!  
    }
}
Run Code Online (Sandbox Code Playgroud)

我还想检查Method B实际可见的Method A(包范围等).

您是否曾经历过一种可靠的方法来确定方法是否被覆盖?

谢谢

Sta*_*kER 5

如果不涉及泛型,则存在确定方法是否被覆盖的现有答案

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
}
Run Code Online (Sandbox Code Playgroud)

有两种 doStuff 方法。它是一种桥接方法。它只是做类型转换并调用 void doStuff(java.lang.String),所以实际上void doStuff(java.lang.String) 没有被覆盖,但void doStuff(java.lang.Object) 是. 当您使用多态时,例如:

Foo foo = new FooImpl();
foo.doStuff("ABC")
Run Code Online (Sandbox Code Playgroud)

它实际上调用了 void doStuff(java.lang.Object)。所以如果你用上面的链接检测void doStuff(java.lang.Object)是否被覆盖,就会报yes。

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
Run Code Online (Sandbox Code Playgroud)