2017-07-25 22 views
0
public interface TestServiceIface { 
    default String test(String str, int flag) { 
     return str; 
    } 
} 

インターフェースインターフェースの使用反射のデフォルトメソッドを呼び出して、インスタンスを持って、どのように私は、デフォルトのメソッドを呼び出すことができますか?反射を使用する場合、どのように行うか? 私はこのインターフェース、Implクラス、およびImpl instance.howをデフォルトメソッドを呼び出すことしかできません。どのようにインターフェイスを実装している場合、このような

+1

インスタンスのクラスでの反射を使用して、例えば'instance.getClass()。getMethod(" test ")'は動作しません。 –

+1

あなたの努力は何ですか? –

+0

オーバーライドしない限り、他のメソッドと同じようにメソッドを呼び出すことができます。メソッドがオーバーライドされている場合は、他のメソッドと同様に、オーバーライドするメソッドをバイパスする公式の方法はありません。 – Holger

答えて

3

あなたは以下のように反射して、インターフェイスデフォルトメソッドにアクセスすることができます。サブクラスはデフォルトの方法をオーバーライドする場合は、その後、オーバーライドメソッドはまた、インターフェイスのデフォルトの方法を意味し、呼び出されます

Class<TestServiceIface> type = TestServiceIface.class; 

Method defaultMethod = type.getMethod("test", String.class, int.class); 

String result = (String) defaultMethod.invoke(instance, "foo", 0); 

多形をサポートします。

3

またはMethodHandleを経由して、しかし、あなたが実際にそのインタフェースの実装クラスを必要としていることに気づくん:

static class Impl implements TestServiceIface { 

} 

と使用方法:

MethodType methodType = MethodType.methodType(String.class, String.class, int.class); 
    MethodHandle handle = MethodHandles.lookup().findVirtual(TestServiceIface.class, "test", methodType); 

    String result = (String) handle.invoke(new Impl(), "test", 12); 
    System.out.println(result); // test 
+0

私はそのインターフェイスの実装クラスがない場合、それを行うことはできますか? – twogoods

+0

@twogoodsいいえ、あなたは傾けることができません – Eugene

関連する問題