S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

インターフェースでも確認

継承元のクラスで取得したメソッドが動くってことは、インターフェースでも動くよな?とか。

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)