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學習之十】yield之send方法
下一條 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