Java中如何调用被子类重写的抽象类中的方法?
如何在不修改B类的前提下调用A类的m1()方法?
interface I1 { void m1(); } interface I2 { void m2(); } abstract class A implements I1, I2 { public void m1() { System.out.println("Inside A: m1()"); } } class B extends A { public void m1() { System.out.println("Inside B: m1()"); } public void m2() { System.out.println("Inside B: m2()"); } } public class Test { public static void main(String[] args) { // invoke A's m1() A a = new B(); a.m1(); } }
当前代码中,由于动态方法分派(运行时多态),执行a.m1()时会调用B类重写后的m1()方法。要求在不修改B类的前提下,仅调用A类中的m1()方法。
方案1:使用Java反射机制
通过反射可以绕过动态分派逻辑,直接调用父类A的m1()方法。修改Test类的main方法如下:
public class Test { public static void main(String[] args) throws Exception { A a = new B(); // 获取A类的m1()方法 java.lang.reflect.Method methodA = A.class.getDeclaredMethod("m1"); // 传入B类实例调用方法 methodA.invoke(a); } }
方案2:使用MethodHandle(Java 7及以上)
MethodHandle提供了更高效的方法调用方式,同样可以实现调用父类的目标方法:
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; public class Test { public static void main(String[] args) throws Throwable { A a = new B(); // 创建指向A类m1()方法的句柄 java.lang.invoke.MethodHandle mh = MethodHandles.lookup() .findSpecial(A.class, "m1", MethodType.methodType(void.class), B.class); // 调用方法句柄 mh.invokeExact(a); } }
这两种方法都无需修改B类,直接在调用端实现对A类m1()方法的调用。
内容的提问来源于stack exchange,提问作者Shri
相关产品推荐
相关产品推荐

