2016-05-26 6 views
0

私は「defaultConfig」を見たとき、私は、Androidのプラグインを理解しようとしている私は方法がgradle - どのようにインターフェイスorg.gradle.api.Actionは動作しますか?

public void defaultConfig(Action<ProductFlavor> action) { 
    this.checkWritability(); 
    action.execute(this.defaultConfig); 
} 

で見つけて(this.defaultConfit)action.executeを呼び出すことがthis.defaultConfigに対してクロージャを呼び出します。

これは混乱しています。そのため、私はInterface Actionの文書を見て、それが持つ魔法を見ました。

Actionインターフェースのdocによると、action.execute(obj)を呼び出すと、実際には "指定されたオブジェクトに対してこのアクションを実行します"、ここで指定されたオブジェクトはobjです。

これはどのように機能しますか?

ASAIK、objに対してメソッドを呼びたい場合は、obj:it.doSth()を参照するために "it"を使用します。そうでない場合、メソッドは "this"に対して呼び出されます。

Actionインターフェイスを使用する場合、「it」は必要なくなり、このインターフェイス内のメソッド呼び出しは「it」に対して呼び出されます。

は、私もそれをテストするためにいくつかのコードを記述します。私のインターフェースMyActionは「それ」だけで動作するはずです、しかし、それはしませんでしたなしのActionインタフェースは、その後actionNameのを呼び出して、持っている魔法を持っていた

class Main { 
     Test test = new Test() 
     test.actionReceiver { 
//   actionName "test ok" 
      it.actionName "test ok" 

     } 

    } 

    static interface MyAction<T> { 
     void execute(T) 
    } 

    static class MyActionReceiver { 
     void actionName(String name) { 
      println name 
     } 
    } 

    static class Test { 
     MyActionReceiver actionReceiver = new MyActionReceiver() 

     void actionReceiver(MyAction<MyActionReceiver> action) { 
      action.execute(actionReceiver) 
     } 

    } 

} 

場合。

私の質問は、Actionインターフェイスがどのように機能するのですか。インターフェイスを同じように動作させるにはどうすればよいですか。

+0

カスタムタスクを記述する場合は

task hello { doLast { println 'Hello world!' } } 

は、あなたは、単に@TaskActionアノテーションで、あなたの主なアクションに注釈を付けることができますGroovyの基礎を学ぶべきか、特にCl痛みの仕事。その知識がなければ、プラグイン用のコードを記述するのは非常に困難です。 http://groovy-lang.org/closures.htmlを参照してください。 – Jolta

答えて

1

グラードタスクには、1つ以上のアクションを含めることができます。あなたはここにアクションの詳細を見つけることができます。 https://docs.gradle.org/current/javadoc/org/gradle/api/Action.html#execute(T) アクションは、通常

doFirst {...}で定義されてい

または

doLast {...}

タスク定義のブロック。参照:

task hello(type: GreetingTask) 

class GreetingTask extends DefaultTask { 
    @TaskAction 
    def greet() { 
     println 'hello from GreetingTask' 
    } 
} 

いくつかのより便利なリンク:

https://docs.gradle.org/current/userguide/tutorial_using_tasks.html https://docs.gradle.org/current/javadoc/org/gradle/api/Task.html

関連する問題