Eclipse 4.x中Command是如何對映到Handler的
1. Eclipse中的Command模式,使得具體的實現和Command定義分離,便於維護。
但是在Debug的時候,或者沒有souce code的時候,我們想知道每一個commandId對應的Handler是什麼,怎麼辦?
2. 在Eclipse 4.x中,其實當Eclipse啟動完成後,它已經建立了commandId和對應Handler的Map,儲存在EclipseContext中,
然後通過反射呼叫到對應的Handler。 見下圖:
Eclipse是在上圖中我框出來的地方,通過commandId在EclipseContext中查詢到。
3. 如何將EclipseContext中的Handler都dump出來呢?
一句話,反射。
注意,以下程式碼我只在Eclipse 4.3.0上測試通過。
//try to print all handler in eclipse 4.x result = ReflectionUtils.getField("e4Context", site); if(!isSuccess(result)) { return; } if(result instanceof IEclipseContext) { IEclipseContext context = (IEclipseContext)result; printHandlerForEclipseContext(context, 0); }
@SuppressWarnings("unchecked") private void printHandlerForEclipseContext(IEclipseContext context, int step) { Assert.isNotNull(context); Object result = null; if(step != 0) { result = ReflectionUtils.getField("localValueComputations", context); } else { result = ReflectionUtils.getField("localValues", context); } if(!isSuccess(result)) { return; } if(result instanceof Map) { String stepString = makeStep(step); Map<String, Object> localValueComputations = (Map<String, Object>)result; for (String string : localValueComputations.keySet()) { Object object = localValueComputations.get(string); String last = object.toString(); if(string.startsWith("legacy::handler::")) { if(object instanceof ArrayList) { ArrayList list = (ArrayList)object; //TODO may be more than one item in list object = list.get(0); if(object instanceof IHandlerActivation) { IHandlerActivation activation = (IHandlerActivation)object; last = activation.getHandler().toString(); } } } System.out.println(stepString + string + ", " + last); } } result = null; result = ReflectionUtils.invokeMethod(context, "getChildren"); if(!isSuccess(result)) { return; } if(result instanceof Set) { Set<IEclipseContext> children = (Set<IEclipseContext>)result; Iterator<IEclipseContext> iterator = children.iterator(); IEclipseContext child = null; int moreStep = step + 1; while(iterator.hasNext()) { child = iterator.next(); printHandlerForEclipseContext(child, moreStep); } step ++; } }
以下是我的螢幕輸出的一部分,輸出格式為:commandId, Handler
...
legacy::handler::org.eclipse.ui.edit.text.recenter, ActionHandler([email protected])
legacy::handler::org.eclipse.jdt.ui.edit.text.java.search.declarations.in.hierarchy, ActionHandler([email protected]26e4a)
legacy::handler::org.eclipse.jdt.ui.edit.text.java.search.declarations.in.project, ActionHandler([email protected]3f5)
legacy::handler::org.eclipse.jdt.ui.edit.text.java.surround.with.try.multicatch, ActionHandler([email protected]996)
legacy::handler::org.eclipse.jdt.ui.edit.text.java.override.methods, ActionHandler([email protected])
legacy::handler::org.eclipse.ui.edit.findPrevious, ActionHandler(org.eclipse.ui.texteditor.FindNextAction@69d5ee81)
handler::org.eclipse.jdt.ui.edit.text.java.remove.block.comment, org.eclipse.ui.[email protected]207462c0
...
相關推薦
Eclipse 4.x中Command是如何對映到Handler的
1. Eclipse中的Command模式,使得具體的實現和Command定義分離,便於維護。 但是在Debug的時候,或者沒有souce code的時候,我們想知道每一個commandId對應的Handler是什麼,怎麼辦? 2. 在Eclipse 4.x中,其實當Ecl
OpenCV3.4.X中Nonfree模組的使用-SURF為例
作者使用OpenCV3.4.3+VS2015+CMake3.8.2編譯了包含opencv3.4.3以及opencv_contrib的完整的OpenCV庫,因而能夠使用tracking、saliency等非穩定模組。 在後續工作中又需要利用SURF進行實驗,程式碼如下: P
基於BootStrap 4.x 中的Flex 實現各種佈局
各種佈局,總有一款適合你 基於bootstrap 4.x 中的flex 佈局 1、左右結構(左窄右寬) <div class="d-flex flex-row" style="width: 500px; height: 400px;border:2px solid #ae00e6">
Linux kernel 4.x中的min和max巨集
min和max是兩個很常用的操作,一般都是用巨集實現的,不過想要寫出一個很完善的巨集定義還是要考慮很多問題的,本文就來分析下Linux Kernel中的實現方法。文中僅考慮min,max的結構與其完全相同,只要修改下大於小於號即可。 巨集定義中要將整體和變數都
ArcGIS API for JavaScript 4.x中的3D部分(3)
(3)基於cityengine建模,ArcGIS Portal釋出Web服務 本篇文章主要針對自行生產、釋出、使用3D圖形服務資料。若沒有這類特別需求,可直接使用esri官網API中提供 的服務,簡單
[Unity]關於Unity5.5以及5.4.x中的UGUI在安卓中出現Image不顯示的BUG的解決辦法
使用Instantiate建立UGUI的元件,就有可能會出現看不到的情況,這種看不到不只是看不到,連事件本身也是無法接收,如果除錯會發現物體是在場景中存在的。 如果Canvas設定成overlay就不會有這個問題,但是這個不是解決辦法,因為總有需要設定攝像機的時候。 其
關於Eclipse項目中加入jquery-1.x.js文件報錯問題
文件 div bsp 顯示 項目 但是 目的 data pro 現在使用Eclipse3.7及以後的版本的時候,加入jQuery文件會報錯,上面顯示一個小小的紅色X,雖然這個並不會影響項目的運行,但是這個卻會影響到開發人員的心情,看這總是很不爽,怎麽樣才能解決呢。很簡單,首
webpack 4.x 解決 webpack-dev-server工具在webpack構建的專案中使用問題
首先將webpack-dev-server安裝到專案中 npm install webpack-dev-server -D 這時在powershell中敲 webpack-dev-server 會發現 'webpack-dev-server' 不是內部或外部命令,也不是可執行的程式 或批
webpack 4.x 解決 webpack-dev-server工具在webpack構建的項目中使用問題
運行 shel pts class col png 技術 style 發現 首先將webpack-dev-server安裝到項目中 npm install webpack-dev-server -D 這時在powershell中敲 webpack-dev-server
0003-OpenCV中重對映函式remap的使用,以影象在x和y方向的翻轉為例!
首先介紹一下remap函式! remap就是用來做重對映的,重對映的含義這裡先不講,大家看完這篇文章就知道了! 函式原型如下: C++: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, i
精通Spring+4.x++企業開發與實踐之IoC容器中裝配Bean
Spring配置概述 Spring屬性注入 JavaBean關於屬性命名的特殊規範 Spring配置檔案中的<property></property>元素所指定的屬性名和Bean實現類的Setter方法滿足Sun JavaBean的屬性命名規範:xxx的屬性對應的
Cocos2d-x中的4種佈局
Cocos2d-x中一共有4種佈局:ABSOLUTE(絕對佈局)、HORIZONTAL(水平佈局)、VERTICAL(垂直佈局)和RELATIVE(相對佈局)。 注意,只有在絕對佈局內部,元件使用setPosition()方法來指定其位置。另外三種佈局中的元件,setP
[翻譯]Unit testing with JUnit 4.x and EasyMock in Eclipse
譯文: 在Eclipse中使用Junit4.x與EasyMock進行單元測試 摘要 這篇文章簡單講解了如何在Eclipse中利用Junit 4.x和EasyMock進行單元測試。 當你閱讀完這篇文章後,可以在Eclipse中使用JUnit進行單元測試。 1. 概要 1.1. 單元測試
Android Studio工程如何放到Android 4.X原始碼環境中編譯
現有專案需要用到RecyclerView、Leanback、Cardview等一些比較新的Support庫,且用來編譯的buildToolsVersion已經需要用到最新的23.0.1,targetSdkVersion是23。 之前嘗試在Ec
Spring 4.x框架中的新特性---4.1中的新功能和提升
JMS的改善 Spring4.1通過引入帶有@JmsListener註解的bean方法給註冊JMS監聽端點提供一個更加簡單的基礎設施。XML名稱空間已經被增強,以便支援這種新的樣式(jms:annotation-driven),並它還可以使用Java配置(@EnableJm
Appium+Robotframework實現iOS應用的自動化測試-4:OS X中安裝和啟動RIDE
有兩種方式進行Appium測試: 1. 遠端方式進行Appium測試:在Windows系統中啟動RIDE並執行測試,這種方式的好處是方便,簡單,但在一開始可能因為配置的問題測試跑不起來; 2.本地方式
Cocos2d-x中Vector<T>容器以及實例介紹
top 宋體 hello 操作符 模板類 log ins bsp main Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容納的是Ref及子類所創建的對象指針,其中的T是模板,表示能夠放入到容器中的類型,在Cocos2d-x 3.x
python系列(五)centos6.x中部署多個python版本
python pyenv centos6.x virtualenv 博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什麽疑問的朋友可以聯系博主,博主會幫你們解答,謝謝支持!使用pyenv+virtualenv方式部署python多版本pyenv
在Mac OS X中下載Android源代碼的一些經驗
總結 同步 uil 空白 googl 新版 -h 教程 files 首先說明。隨著最近(2014年6月開始)GFW的升級。這個站點:http://www.android.com/ 已經不能正常訪問了,以下的這些操作均是在我連接VPN的時候進行的。 首先,須要做一些準
Vue2.x中的Render函數
res ima 文本 技術 asc 點數據 而不是 reat javascrip Render函數是Vue2.x版本新增的一個函數;使用虛擬dom來渲染節點提升性能,因為它是基於JavaScript計算。通過使用createElement(h)來創建dom節點。create