2012-11-13 12 views
5

javaのinvokeメソッドを使用する際に問題があります。パラメータを使用したプライベート静的メソッドのJavaリフレクション

私は私にMethodオブジェクトを提供するために使用する方法を持っていると同じように見え:私は任意のコンテキスト(静的、または非から、メソッドにアクセスしようとしているとき、[OK]を、この方法では完璧に動作

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; 
} 

静的)で、引数はありません。

今の問題は、私は、例えば、引数を持つメソッドに引数を呼び出し、パスを呼び出すことができないということです。

私は、次の方法があります。

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

をそして、私は呼び出したいですそれは次のようなものです:

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

パラメータを持つプライベート静的メソッドを呼び出すにはどうすればよいですか?

どのように値をそのメソッド引数に渡すことができますか?

おかげで、 Arkde

答えて

6

あなたは明示的に与えられたパラメータ型で宣言されたメソッドを探し反射法を呼んでいる - しかし、あなたは、任意のパラメータの種類を提供していません。

あなたはgetDeclaredMethods()を使用して、名前だけでフィルタリング、与えられた名前でに任意の方法を見つけたい...しかし、あなたはinvokeを呼び出すときに、あなたはパラメータの型、文字列にをない提供する必要がある場合。

また、パラメータの型を受け入れるもにごprovideMethodの呼び出しを変更するので、あなたが使用することができます。

DataUtils.provideMethod("createDirectory", FileUtils.class, 
         String.class, String.class) 
     .invoke(null, "foo", "bar") 
+0

ありがとうございました:) – Arkde

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; 
} 
+0

ありがとうございました! :)あなたの答えに感謝、それは私を助けました:) – Arkde

2

変更この

その

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

とあなたののようなものに

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

それに応じて。

+0

ありがとう! :)私はあなたの答えに感謝、それは私を助けた:) – Arkde

関連する問題