1. 程式人生 > >Gradle原始碼入門學習之十-- Listener & Dispatch

Gradle原始碼入門學習之十-- Listener & Dispatch

new ListenerBroadcast<OutputEventListener>(OutputEventListener.class);
->
    public ListenerBroadcast(Class<T> type) {
        this.type = type;
        broadcast = new BroadcastDispatch<T>(type);
        source = new ProxyDispatchAdapter<T>(broadcast, type);
    }
->
	//broadcast的初始化:1 type  2. handlers
	public BroadcastDispatch(Class<T> type) {
        this.type = type;
    }
	
	//生成的broadcast,傳給dispatch param
	public ProxyDispatchAdapter(Dispatch<? super MethodInvocation> dispatch, Class<T> type, Class<?>... extraTypes) {
        this.type = type;
		//傳入的dispatch 是上面的 broadcast 變數,通過InvocationHandler的建構函式, 
		//在Invoke的時候,其實是broadcast在發訊息,call dispatch函式.
        source = type.cast(Proxy.newProxyInstance(classLoader, types.toArray(new Class<?>[types.size()]),
                new DispatchingInvocationHandler(type, dispatch)));
    }
------------>	
	    private DispatchingInvocationHandler(Class<?> type, Dispatch<? super MethodInvocation> dispatch) {
            this.type = type;
            this.dispatch = dispatch;
        }
		
		
		 public Object invoke(Object target, Method method, Object[] parameters) throws Throwable {
            dispatch.dispatch(new MethodInvocation(method, parameters));
        
        }
		
In DefaultGradle's constructor
buildListenerBroadcast = listenerManager.createAnonymousBroadcaster(BuildListener.class);
->DefaultListenerManager.java
    public <T> ListenerBroadcast<T> createAnonymousBroadcaster(Class<T> listenerClass) {
        ListenerBroadcast<T> broadcast = new ListenerBroadcast(listenerClass);
        broadcast.add(getBroadcasterInternal(listenerClass).getSource());
        return broadcast;
    }
->
    private <T> ListenerBroadcast<T> getBroadcasterInternal(Class<T> listenerClass) {
        synchronized (lock) {
            ListenerBroadcast<T> broadcaster = broadcasters.get(listenerClass);
            if (broadcaster == null) {
                broadcaster = new ListenerBroadcast<T>(listenerClass);
                broadcaster.add(getLogger(listenerClass));    //so BuildLogger 's method buildStarted can be called later.
                broadcaster.add(getDispatcher(listenerClass));
                if (parent != null) {
                    broadcaster.add(parent.getDispatcher(listenerClass));
                }
                broadcasters.put(listenerClass, broadcaster);
            }

            return broadcaster;
        }
    }
at this time before execute the function 'getBroadcasterInternal'
broadcasters =
{interface org.gradle.api.execut
[email protected]
1160f3c, interface org.gradle.groovy.script[email protected]14236f4, interface org.gradle.api.loggi[email protected]a6d0a4, interface org.gradl[email protected]25fbfa, interface org.gradle.api.execution.T[email protected]1c2074c} Then it can not find 'listenerClass', it will create a new ListenerBroadcast, add 2 or 3 items to its 'broadcast' variable 's handlers and put the new object into 'broadcasters' queue. broadcasters= {interface org.gradle.api.execut
[email protected]
1160f3c, interface org.gradle.groovy.script[email protected]14236f4, interface [email protected]2d1f6d, <---------------------new one interface org.gradle.api.loggi[email protected]a6d0a4, interface org.gradl[email protected]25fbfa, interface org.gradle.api.execution.T
[email protected]
1c2074c} script.run()之前,都會script.init(target, services), 這個target就是gradle例項,以後call這個clousre時候的receiver in callsite function. in DefaultGradleLauncher.java // Evaluate init scripts initScriptHandler.executeScripts(gradle); -> script.run () -> init_<a-z>.run() public Object run() { CallSite[] arrayOfCallSite = $getCallSiteArray();return arrayOfCallSite[0].call(arrayOfCallSite[1].callGroovyObjectGetProperty(this), new init_c69lrc3uiec789gk9t0jr56ux._run_closure1(this));return null; } -> public static Object defaultCall(CallSite callSite, Object receiver, Object[] args) throws Throwable { return createCallSite(callSite, receiver, args).call(receiver, args); } //receiver is our gradle instance, args is array of Closure objects , //[0] = [[email protected]] -> DefaultGradle.java public void projectsLoaded(Closure closure) { buildListenerBroadcast.add(new ClosureBackedMethodInvocationDispatch("projectsLoaded", closure)); } //In Constructor of DefaultGradleLauncher, gradle.getBuildListenerBroadcaster() is paased to the constructor, and worked as //private final BuildListener buildListener; public BuildListener getBuildListenerBroadcaster() { return buildListenerBroadcast.getSource(); }


相關推薦

Gradle原始碼入門學習-- Listener & Dispatch

new ListenerBroadcast<OutputEventListener>(OutputEventListener.class); -> public ListenerBroadcast(Class<T> type) {

Mysql學習二:JDBC連接數據庫DriverManager方法

url state 種類 delet rom 條件 管理系 ont into JDBC連接數據庫 ?創建一個以JDBC連接數據庫的程序,包括7個步驟: 1、載入JDBC驅動程序: 在連接數據庫之前。首先要載入想要連接的數據庫的驅動到JVM

java入門學習

java開發之路java是面向對象的編程,個人覺得記憶比較重要。第一階段java基礎部分unix開發環境熟練掌握開發中常用的操作系統linux的安裝及使用:掌握文件系統、網絡、用戶管理方法:能熟練使用vi和vim進行文件編輯;能在unix環境下進行文件查找、權限控制、能熟練配置用戶使用環境及開發生產環境。(1

WorkerMan 入門學習(三)基礎教程-Timer類的使用

timer類 定時 基礎教程 連接 worker loader 入門 入門學習 json 1、ServerTimer.php 代碼: <?php /** * 定時器學習 */ require_once __DIR__ . ‘/Workerman/Autoload

Nginx學習一-Nginx啟動框架處理流程

table ssl 優先級 init int 數組 linux cmd 默認 Nginx啟動過程流程圖 下面首先給出Nginx啟動過程的流程圖: ngx_cycle_t結構體 Nginx的啟動初始化在src/core/nginx.c的main函數中完成,當然main

大數據學習二——MapReduce代碼實例:關聯性操作

reducer equal 學習 obj actor 對應關系 關系 exceptio ted 1.單表關聯 "單表關聯"要求從給出的數據中尋找所關心的數據,它是對原始數據所包含信息的挖掘。 實例描述給出child-parent(孩子——父母)表,要求輸出grandchil

大數據學習五——sqoop的安裝和使用

dfs 9.1 pos 屬性 操作 所有 alt 成功 nbsp 1.概念了解 sqoop主要用於hadoop與傳統的數據庫(mysql、postgresql...)間進行數據的傳遞,可以將一個關系型數據庫(例如:MYSQL,Oracle,Postgrep等)中的數據導到h

Tensorflow深度學習二:基礎圖像處理

fcm 數字 ssi port con tty .net term file Tensorflow深度學習之十二:基礎圖像處理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出

Linux學習一-Linux字符集及亂碼處理

gin tails 讀取 文件 latin1 style ESS 自身 win Linux字符集及亂碼處理 1、字符(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集(Character set)是多個字符的集合,字符集種類較多

Linux學習六-Linux用戶管理

host 通用 sla 文章 create HR test 範圍 HA Linux用戶管理 Linux系統跟Windows系統一樣,可以創建不同的用戶,不同的用戶組。在不同用戶下使用系統具有相應的權限 創建一個普通用戶時,會修改幾個文件,拷貝一些初始文件到用戶家目錄中 修改

Linux學習五-Linux文件特殊權限和附加權限

增加 ech IE address 二進制 prot atime 說明 orm Linux文件特殊權限和附加權限 1、特殊權限suid 範圍:只能針對二進制命令文件 作用:讓普通用戶擁有二進制命令文件所有者的權限 舉例1:普通用戶使用passwd命令修改密碼 cat /e

【Python學習】yieldsend方法

下一條 lis 區別 但是 查找 接受 python 方法 完全 yield作用   簡單地講,yield 的作用就是把一個函數變成一個 generator,帶有 yield 的函數不再是一個普通函數,Python 解釋器會將其視為一個 generator。下面以斐波拉契數

python入門學習Django框架設計思想

談到在web應用領域,除了Python的語法,Django是Python後臺一個最重要的框架,那麼,什麼是軟體框架呢? 舉個簡單的例子,對於一個公司來說,公司中有各個職能部門,每個部門各司其職,通過部門之間的配合來完成工作,這些部門就形成了一個公司的組織架構。從某種意義上來說,公司就是一種框架。

濾波器學習一種通用濾波演算法

十一種通用濾波演算法 1、限幅濾波法(又稱程式判斷濾波法) A、方法: 根據經驗判斷,確定兩次取樣允許的最大偏差值(設為A) 每次檢測到新值時判斷: 如果本次值與上次值之差<=A,則本次值有效 如果本次值與上次值之差>A,則本次值無效,放棄本次值,用

【OpenCV入門教程二】OpenCV邊緣檢測 Canny運算元 Sobel運算元 Laplace運算元 Scharr濾波

                本篇文章中,我們將一起學習OpenCV中邊緣檢測的各種運算元和濾波器——Canny運算元,Sobel運算元,Laplace運算元以及Scharr濾波器。文章中包含了五個淺墨為大家準備的詳細註釋的博文配套原始碼。在介紹四塊知識點的時候分別一個,以及最後的綜合示例中的一個。文章末尾

【OpenCV入門教程七】OpenCV重對映 SURF特徵點檢測合輯

                本篇文章中,我們一起探討了OpenCV中重對映和SURF特徵點檢測相關的知識點,主要一起了解OpenCV中重對映相關的函式remap,SURF演算法在OpenCV中的體現與應用。此博文一共有三個配套的麻雀雖小但五臟俱全的示例程式,其經過淺墨詳細註釋過的程式碼都在文中貼出,且文章

【Python+OpenCV入門學習二、影象的幾何變換

本篇文章介紹影象處理的幾何變換,幾何變換有平移、縮放、旋轉等。 主要學習resize()、warpAffine()等函式的使用。 環境:Windows 7(64)   Python 3.6    OpenCV3.4.2 一、縮放 1.1 resize()函式介紹 r

Numpy入門學習(二)linalg庫----向量範數、矩陣範數、行列式、矩陣逆、冪

老師課堂總結,請勿轉載 Numpy中的核心線性代數工具 numpy.linalg模組包含線性代數的函式。使用這個模組,我們可以計算逆矩陣、求特徵值、解線性方程組以及求解行列式等。 求解矩陣的範數 在實數域中,數的大小和兩個數之間的距離是通過絕對值來度量 的。在解析幾何中,向

Python程式設計入門學習筆記()

<h1 style="text-align:center">泰坦尼克資料處理與分析 </h1> ![](http://www.allengao.cn/wp-content/uploads/2018/06/Titanic.jpg) ```pytho

JAVA 入門學習路-註冊登入案例。

新建專案,結構如下: 新建資料庫連線工具類: /** * 資料庫連線工具類 * Created by Chao on 2016/12/3. */ public class DBUtils { private static Strin