継承元のクラスで取得したメソッドが動くってことは、インターフェースでも動くよな?とか。
import java.io.Serializable; import java.lang.reflect.Method; public class ReflectTest2 implements Serializable { private static final long serialVersionUID = 37451942812970775L; public void writeInterface() { System.out.println("ReflectTest2#writeInterface"); } public static void main(String[] args) { new ReflectTest2().test(); } public void test() { try { ReflectTest2A testA = new ReflectTest2A(); ReflectTest2B testB = new ReflectTest2B(); Method writeInterfaceMethod = IReflectInterfaceTest.class.getDeclaredMethod("writeInterface", (Class[]) null); // ReflectTest2のwriteInterfaceが呼ばれる writeInterfaceMethod.invoke(testA, (Object[]) null); // ReflectTest2BのwriteInterfaceが呼ばれる writeInterfaceMethod.invoke(testB, (Object[]) null); // ReflectTestは型が異なるため例外 writeInterfaceMethod.invoke(this, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } } public class ReflectTest2A extends ReflectTest2 implements IReflectInterfaceTest { private static final long serialVersionUID = -9112990228915100125L; public ReflectTest2A() { super(); } } public class ReflectTest2B implements IReflectInterfaceTest, Serializable { private static final long serialVersionUID = -2690149449071105996L; public ReflectTest2B() { super(); } public void writeInterface() { System.out.println("ReflectTest2B#writeInterface"); } } public interface IReflectInterfaceTest { public void writeInterface(); } }
予想通りの結果
ReflectTest2#writeInterface ReflectTest2B#writeInterface java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at hogehoge.ReflectTest2.test(ReflectTest2.java:24) at hogehoge.ReflectTest2.main(ReflectTest2.java:12)