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) 收藏 举报
浙公网安备 33010602011771号