method java_为什么Super.method();在Java中是不允许的?

在大多数情况下,我认为下面的代码允许使用超级.方法()。(即使这么做很狡猾)

总之创建祖先类型的临时实例

将字段的值复制到

原版对象改为临时对象。

对临时对象调用目标方法

将修改后的值复制回原始对象

用法: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);

}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值