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

参见英文答案 >
Java: How to find if a method is overridden from base class?8个

这可能吗?

我发现唯一的解决方案通常认为一个方法是覆盖的,如果B类可以从A类分配,如果方法A具有与方法B相同的签名.但是它并没有覆盖每一种情况!

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

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

class FooImpl implements Foo<String> {
    public void doStuff(String args) {
        //Is overriden!  
    }
}

我也想检查方法B实际上对方法A可见(包范围等).

你有没有经历过一个可靠的方法来确定一个方法是否被覆盖?

谢谢

解决方法

有没有一个
existing answer来确定一个方法是否被覆盖,如果没有泛型涉及.

Java将由于type erasure而完全删除泛型类型.因此字节码将是:

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),那么它会报告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

dawei

【声明】:唐山站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。