JDK6 Bug Class.getDeclaredMethods() 竟然返回了父类方法

原文:http://www.cnblogs.com/mvii/p/3268342.html

 

Bug描述: 

Class.getDeclaredMethods() 的javadoc中明确表示不会返回继承方法,但是实际JDK6在某种情况下会违背这个规则。

This includes public, protected, default (package) access, and private methods, but excludes inherited methods.

 

Bug重现条件:

子类public可见,父类package可见

 

测试代码:

父类,无修饰符

class Parent {
    public void bye() {
        System.out.println("Bye from Parent");
    }
    
    public void hello() {
        System.out.println("Hello from Parent");
    }
}

 

子类,public

public class Son extends Parent {
    public void hello() {
        System.out.println("Hello from Son");
    }
}

 

主程序,

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

public class DeclaredMethodTest {

    public static void main(String[] args) throws Exception {
        List<Method> methods = Arrays.asList(Son.class.getDeclaredMethods());
        System.out.println(methods);

        for (Method method : methods) {
            System.out.println(method.isBridge());
            method.invoke(new Son(), null);
        }
    }
}

 

输出结果:

false
Hello from Son
true
Bye from Parent

Parent方法被调用导致输出“Bye from Parent”

 

PS:如果子类Son Class不是public的就无法重现。

对于这个bug,sun有自己的描述:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

不过他的重现条件和我测试结果有点不符合。

1. Create abstract class A with method foo.
2. Create class B extends A without any method.
3. B.class.getDeclaredMethods() returns method foo().

对于以上说明,根据我的我测试结果,有两点补充:

1.abstract修饰符不影响

2.没有提到class B必须是public

 

posted on 2013-08-19 17:38  malcolmshen  阅读(593)  评论(0)    收藏  举报

导航