5

invokeJavaでメソッドを使用する際に問題が発生しました。

オブジェクトを提供するために使用するメソッドがMethodあり、次のようになります。

 public static Method provideMethod(String methodName, Class targetClass) throws NoSuchMethodException {
    Method method = targetClass.getDeclaredMethod(methodName,null);

    //Set accessible provide a way to access private methods too
    method.setAccessible(true);

    return method;
}

このメソッドは、引数のない任意のコンテキスト(静的または非静的)からメソッドにアクセスしようとしているときに完全に機能します。

ここで問題となるのは、invokeを呼び出して、引数を持つメソッドに引数を渡すことができないことです。たとえば、次のようになります。

私は次の方法を持っています:

private static boolean createDirectory(String path, String fileName) {
  ... 
}

そして、私はそれを次のように呼び出したいと思います:

 Boolean created = (Boolean) DataUtils.provideMethod("createDirectory", FileUtils.class).
            invoke(null, String.class, String.class);

しかし、私は得てjava.lang.NoSuchMethodException: createDirectory []います。

パラメータを持つプライベート静的メソッドを呼び出す方法を誰かが知っていますか?

そして、どうすればそのメソッドの引数に値を渡すことができますか?

ありがとう、Arkde

4

3 に答える 3

6

指定されたパラメータータイプで宣言されたメソッドを探すリフレクションメソッドを明示的に呼び出していますが、パラメータータイプは提供していません。

指定された名前のメソッドを検索するgetDeclaredMethods()場合は、名前でフィルタリングしてください...ただし、を呼び出すときは、パラメータタイプではなく、文字列invokeを指定する必要があります。

provideMethodまたは、呼び出しを変更してパラメータータイプ受け入れるようにし、次を使用できるようにします。

DataUtils.provideMethod("createDirectory", FileUtils.class,
                        String.class, String.class)
         .invoke(null, "foo", "bar")
于 2012-11-13T12:28:00.167 に答える
2

具体的には、呼び出すときに引数のないメソッドのみを検索します

Method method = targetClass.getDeclaredMethod(methodName,null)

createDirectoryメソッドを見つけるには、を呼び出す必要があります

targetClass.getDeclaredMethod("createDirectory", String.class, String.class)

しかし現在、あなたのprovideMethod方法にはこれを行う方法がありません。

のシグネチャを変更してprovideMethod、呼び出し元が探している引数のクラスを渡すことができるようにすることをお勧めします。

public static Method provideMethod(String methodName, Class targetClass, Class... parameterTypes) throws NoSuchMethodException {
    Method method = targetClass.getDeclaredMethod(methodName, parameterTypes);

    //Set accessible provide a way to access private methods too
    method.setAccessible(true);

    return method;
}
于 2012-11-13T12:28:49.240 に答える
2

これを変える

Method method = targetClass.getDeclaredMethod(methodName, null);

そのようなものに

Method method = targetClass.getDeclaredMethod(methodName, Class<?>... parameterTypes);

それにprovideMethod応じて。

于 2012-11-13T12:29:26.527 に答える