2016-05-24 9 views
1

機能インタフェースの本体でリフレクションによってメソッドを呼び出せれば誰でも知っていますか?Java:機能インタフェースのリフレクションによるメソッドの呼び出し

述語を返したいと思います。したがって、典型的な構文は、たとえば

です。しかし、私の特別なケースでは、それは変数なので、クラスも呼び出すメソッドも知られていません。

Method method = Class.forName("Data").getMethod("getVar1", (Class[]) null); 
Predicate<T> pred = data -> 
        ((String) method.invoke(data, (Object[]) null)).equals("foobar"); 

しかし、Eclipseは言う: "に、TargetInvocationExceptionを扱わない"

は、だから私はこのような何かを取得したいです。だから私はtry-catchで囲んだが、Eclipseはすでに同じメッセージを表示している。

誰かが私の手がかりを持っていますか?

+0

カプセル化するmethod.invoke =) –

+0

を何 'Data'動的にロードされたクラスとコンパイル時の型 'T'との関係? 'Data'型の引数を期待する関数が' T'型の引数を受け入れると主張するのは正しいとは思われません... – Holger

答えて

2

これを試してみてください:メソッドへ

Predicate<T> pred = data -> { 
     try { 
      return ((String) method.invoke(data, (Object[]) null)).equals("foobar"); 
     } catch (IllegalAccessException illegalAccessException) { 
// 
     } catch (IllegalArgumentException illegalArgumentException) { 
// 
     } catch (InvocationTargetException invocationTargetException) { 
// 
     } 
     return false; 
    }; 
+1

'String'へのキャストは時代遅れです。単純にそのメソッドとして' equals'を呼び出すことができます'Object'で既に定義されています。さらに、 'ReflectiveOperationException'をキャッチするだけで十分です。これは必要なチェック例外をすべてカバーします。また、 'invoke'のvarargsの性質を気にしてください。単に 'method.invoke(data)'と言うことができます。すべてをまとめる: '述語 pred = data - > {try {return method.invoke(data).equals( "foobar"); } catch(ReflectiveOperationException ex){新しいAssertionErrorをスローする; }} ' – Holger

+0

問題は未処理例外に関するものでした。私はトピックスターターのスニペットを取った。 –

関連する問題