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 (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
