我有两节课:
public class A { public Object method() {...} } public class B extends A { @Override public Object method() {...} }
我有一个实例B。如何调用A.method()从b?基本上,效果与super.method()从调用相同B。
B b = new B(); Class<?> superclass = b.getClass().getSuperclass(); Method method = superclass.getMethod("method", ArrayUtils.EMPTY_CLASS_ARRAY); Object value = method.invoke(obj, ArrayUtils.EMPTY_OBJECT_ARRAY);
但是上述代码仍会调用B.method()。
B.method()
如果使用的是JDK7,则可以使用MethodHandle实现此目的:
public class Test extends Base { public static void main(String[] args) throws Throwable { MethodHandle h1 = MethodHandles.lookup().findSpecial(Base.class, "toString", MethodType.methodType(String.class), Test.class); MethodHandle h2 = MethodHandles.lookup().findSpecial(Object.class, "toString", MethodType.methodType(String.class), Test.class); System.out.println(h1.invoke(new Test())); // outputs Base System.out.println(h2.invoke(new Test())); // outputs Base } @Override public String toString() { return "Test"; } } class Base { @Override public String toString() { return "Base"; } }