我可以在Java中覆盖私有方法吗?

我可以在Java中覆盖私有方法吗?,第1张

我可以在Java中覆盖私有方法吗?

私有方法不会被继承,并且不能以任何方式覆盖。谁告诉过您您可以进行反思,那就是撒谎或谈论其他事情。

但是,您可以访问

getInt
任何子类正在调用的private方法,
printInt
如下所示:

public void printInt() throws Exception {    Class<? extends SuperClass> clazz = getClass();    System.out.println("I am " + clazz + ". The int is " + clazz.getMethod("getInt").invoke(this) );}

这将具有

getInt
从超类调用子类的方法的效果
printInt
。当然,如果子类 声明a
,现在将失败
getInt
,因此您必须添加检查以处理“正常”子类,而不试图“覆盖”私有方法:

public void printInt() throws Exception {    Class<? extends SuperClass> clazz = getClass();    // Use superclass method by default    Method theGetInt = SuperClass.class.getDeclaredMethod("getInt");    // Look for a subclass method    Class<?> classWithGetInt = clazz;    OUTER: while( classWithGetInt != SuperClass.class ){        for( Method method : classWithGetInt.getDeclaredMethods() ) if( method.getName().equals("getInt") && method.getParameterTypes().length == 0 ){     theGetInt = method;     break OUTER; }        // Check superclass if not found        classWithGetInt = classWithGetInt.getSuperclass();    }    System.out.println("I am " + classWithGetInt + ". The int is " + theGetInt.invoke(this) );}

您仍然必须更改超类代码才能使其正常工作,并且由于必须更改超类代码,因此应该只将access修饰符更改为

getInt
protected
而不是进行反射式修改。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5177539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存