2012-05-03 20 views
2

私は、ファイルの内容が正しくフォーマットされているかどうかの規則のコレクションを含むgroovyユニットテストクラスに取り組んでいます。 (適切なルールエンジンを使用していないため、Groovyのアサーション機能を利用して、ルールエンジンとは似通った方法でバリデーションを行うだけです)私はFireAllRulesというメソッドを作成することができると考えていました。リフレクトを使用してjava/groovyオブジェクトの静的メソッドを呼び出す

public static void FireAllRules(File file) 
{ 
    for(def method in Class.getMethods) 
    { 
     if(method.name.indexOf("rule" == 0) method.invoke(file); 
    } 
} 

ループを拾いたいすべてのメソッドは静的で、デバッグプロセス中に気付きました。私のルールメソッドはClass.getMethods()列挙に含まれていません。理想的には、私は、java.Objectとともに入ってくる数多くの興味深いメソッドをソートするのではなく、私が個人的にクラスに書き込んだメソッドをループするだけです。実行時にこれらの静的メソッドを反復処理するためにリフレクションを使用する方法はありますか?

答えて

5

を考える:

class Test { 
    public static testThis() { 
    println "Called testThis" 
    } 

    public static woo() { 
    println "Called woo" 
    } 

    public static testOther() { 
    println "Called testOther" 
    } 
} 

をあなたが行うことができます。

Test.metaClass.methods.grep { it.static && it.name.startsWith('test') }.each { 
    it.invoke(Test) 
} 

を印刷するには:

Called testOther 
Called testThis 

クラスの静的テストメソッドを実行するためのより一般的な方法は次のようになります。

def invokeClass(clazz) { 
    clazz.metaClass.methods.grep { it.static && it.name.startsWith('test') }.each { 
    it.invoke(clazz) 
    } 
} 

invokeClass(Test) 
+0

のようになります。Javaはメタクラスとgrepを持っていますか?これはどの言語ですか? – raddykrish

+1

@raddykrishそれはGroovy –

+0

そして、javaは 'metaClass'と' grep'を持っていません。 –

3

スタティックメソッドは、getMethods()によって返されるメソッドに含まれています。あなたの問題はmethod.name.indexOf("rule" == 0)かもしれません。これはmethod.name.indexOf("rule") == 0、またはさらにはmethod.name.startsWith("rule")にする必要があります。

また、あなたのルールメソッドは公開されていますか?そうでない場合はgetDeclaredMethods()を使用できます。それらを呼び出すには、まずsetAccessible()に電話する必要があります。

2

Javaバージョンは、このようなものになります(明確にするために、インポートと例外を削除しました)。

public class FindAndRunStaticMethods { 
    public static void main(String[] args) { 
     fireAllRules(); 
    } 

    public static void fireAllRules() { 
     for(Method method : StaticMethodClass.class.getDeclaredMethods()) { 
      findAndRunRules(method); 
     } 
    } 

    private static void findAndRunRules(Method method) { 
     if (!Modifier.isStatic(method.getModifiers())) return; 
     if (!method.getName().startsWith("rule")) return; 
     if (!method.getReturnType().equals(Void.TYPE)) return; 

     Class[] parameterTypes = method.getParameterTypes(); 

     if (parameterTypes.length != 1) return; 
     if (!parameterTypes[0].equals(File.class)) return; 

     method.invoke(null, new File("dummy")); 
    } 
} 

サンプルテストクラスは、この

public class StaticMethodClass { 
    public static void ruleHere(File x) { System.out.println("should print"); } 
    public static void ruleRun(File x) { System.out.println("should print"); } 
    public void ruleNotSelected() { System.out.println("not run"); } 
} 
関連する問題