1. 程式人生 > >Eclipse 4.x中Command是如何對映到Handler的

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.xCommand是如何對映Handler

1. Eclipse中的Command模式,使得具體的實現和Command定義分離,便於維護。 但是在Debug的時候,或者沒有souce code的時候,我們想知道每一個commandId對應的Handler是什麼,怎麼辦? 2. 在Eclipse 4.x中,其實當Ecl

OpenCV3.4.XNonfree模組的使用-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-x4種佈局

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-xVector&lt;T&gt;容器以及實例介紹

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