私有方法不会被继承,并且不能以任何方式覆盖。谁告诉过您您可以进行反思,那就是撒谎或谈论其他事情。
但是,您可以访问
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而不是进行反射式修改。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)