使用放射可以看出子类继承了父类的私有方法(不管是否是 final),只是不能直接调用。但是利用反射的方式可以调用:
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Method;
class Parent {
public Parent() {
System.out.println("调用父类的构造方法");
}
private void printParent() {
System.out.println("调用父类的私有方法");
}
private static void staticParent() {
System.out.println("调用父类的私有静态方法");
}
private final void finalParent() {
System.out.println("调用父类的私有 final 方法");
}
}
class Child extends Parent {
public void printChild() {
System.out.println("调用子类的公有方法");
}
}
public class Test {
public static void main(String[] args) throws Exception {
Class child = Class.forName("Child");
Class parent = child.getSuperclass();
Method[] methods = parent.getDeclaredMethods();
AccessibleObject.setAccessible(methods, true);
for (Method method : methods) {
System.out.println();
System.out.println("子类调用方法 " + method.getName() + "() 的调用结果:");
method.invoke(new Child());
}
}
}
/* 运行结果:
子类调用方法 staticParent() 的调用结果:
调用父类的构造方法
调用父类的私有静态方法
子类调用方法 printParent() 的调用结果:
调用父类的构造方法
调用父类的私有方法
子类调用方法 finalParent() 的调用结果:
调用父类的构造方法
调用父类的私有 final 方法
*/