在大多数情况下,我认为下面的代码允许使用超级.方法()。(即使这么做很狡猾)
总之创建祖先类型的临时实例
将字段的值复制到
原版对象改为临时对象。
对临时对象调用目标方法
将修改后的值复制回原始对象
用法:public class A {
public void doThat() { ... }}public class B extends A {
public void doThat() { /* don't call super.doThat() */ }}public class C extends B {
public void doThat() {
Magic.exec(A.class, this, "doThat");
}}public class Magic {
public static void exec(Class oneSuperType, ChieldType instance,
String methodOfParentToExec) {
try {
Type type = oneSuperType.newInstance();
shareVars(oneSuperType, instance, type);
oneSuperType.getMethod(methodOfParentToExec).invoke(type);
shareVars(oneSuperType, type, instance);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static void shareVars(Class clazz,
SourceType source, TargetType target) throws IllegalArgumentException, IllegalAccessException {
Class> loop = clazz;
do {
for (Field f : loop.getDeclaredFields()) {
if (!f.isAccessible()) {
f.setAccessible(true);
}
f.set(target, f.get(source));
}
loop = loop.getSuperclass();
} while (loop != Object.class);
}}