假设我有一个名为SuperClass的类:
public class SuperClass
{
protected void TheCake()
{
System.out.println("The cake is a lie");
}
}
和另一个叫SubClass:
public class SubClass extends SuperClass
{
@Override
protected void TheCake()
{
System.out.println("The cake is not a lie");
}
}
在第三节课我有这个方法
public void GetCake(SuperClass someObject)
{
Class clazz = someObject.getClass();
Method method = clazz.getMethod("TheCake");
method.invoke(someObject, (Object[])null));
}
这将永远不会起作用,因为TheCake受到保护。所以如果我改变这一行:
Method method = clazz.getMethod("TheCake");
到此:
Method method = clazz.getDeclaredMethod("TheCake");
只有someObject是SuperClass的一个实例才有效,如果是SubClass的实例则失败,因为当然该方法是在SuperClass中声明的。
但是如果我这样做呢?
public void GetCake(SuperClass someObject)
{
Class clazz = SuperClass.class;
Method method = clazz.getDeclaredMethod("TheCake");
method.invoke(someObject, (Object[])null));
}
如果someObject是SubClass的一个实例,会调用什么方法?方法的SuperClass定义或SubClass覆盖方法?
答案 0 :(得分:0)
如果您的“其他类”与SuperClass和SubClass在同一个包中
以下方法有效:
(省略了exeption处理)
public void GetCake(SuperClass someObject) {
Class clazz = someObject.getClass();
Method method = clazz.getDeclaredMethod("TheCake");
method.invoke(someObject);
}
如果您希望此代码可以在其他程序包中使用,则可以使用method.setAccessible(true);
您的最终方法将如下所示:
public void GetCake(SuperClass someObject) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
Class clazz = someObject.getClass();
Method method = clazz.getDeclaredMethod("TheCake");
method.setAccessible(true);
method.invoke(someObject);
}