日期:2014-05-20 浏览次数:20883 次
public class Test { public static void main(String[] args) { T2 t = new T2(); t.ff(); } } class T1 { private int f() { return 1; } } class T2 extends T1 { public void ff() { try { Class c = Class.forName("T1"); Method[] m = c.getDeclaredMethods(); m[0].setAccessible(true); Object i = m[0].invoke(this, null); //这里调用私有方法时,参数不是父类对象也可以。 System.out.println(i); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
Class c = Class.forName("T1"); Method[] m = c.getDeclaredMethods(); m[0].setAccessible(true); Object i = m[0].invoke(this, null); //这里调用私有方法时,参数不是父类对象也可以。 System.out.println(i);
------解决方案--------------------
拜托六楼好看看api文档的用法
getDeclaredMethods返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
再引用<<thinking in java>>127页的一句话:
“当这么做时,会自动得到基类中所有的域和方法。”
楼主这下满意了吧
------解决方案--------------------
子类当然继承了父类的所有私有属性和方法,只是没有访问权限,只能通过方法间接访问,
就像即使是父类自己,在外部也是访问不了自己的私有属性的
------解决方案--------------------
final加在方法上意思是不可覆盖,而不是不可继承。
private方法由于子类无法直接访问到,肯定不可覆盖,所以相当于是private final,如果你自己在private 方法上加了final没有什么意义。
这个问题到后来又扯到什么是“继承”上面了,那姑且认定每个人对"继承"的语义有不同的理解,有一个事实是正确的:
"extends声明了子类拥有基类中所有的域和方法"
楼主想的答案这句话自然也可以给出。
------解决方案--------------------