Android Studio Plugin 插件開發教程(一) —— 開發你的第一個插件git
Android Studio Plugin 插件開發教程(二) —— 插件SDK中的經常使用對象介紹github
Android Studio Plugin 插件開發教程(三) —— 製做一個自動生成數據庫代碼的插件數據庫
Android Studio Plugin 插件開發教程(四) —— 爲自動生成數據庫代碼的插件添加UIide
先樹立一個概念,AS裏項目的一切均可以視爲對象,好比整個項目,項目裏的每一個文件,文件裏的每一個方法、每行語句等等都是一個對象。咱們插件SDK的開發,主要工做就是針對這一個個的對象的分析和處理post
下面開始介紹幾個主要的對象類學習
虛擬文件類。
能夠當作Java開發中的File對象理解,概念比較相似測試
傳統的文件操做方法這個對象都支持,好比獲取文件內容,重命名,移動,刪除等spa
PSI系統下的文件類。插件
做爲PSI系統中的一個元素,可使用PSI Element的各類具體方法
看到這裏確定不少人一臉迷惑,這倆File有啥區別?PSI是啥?Element又是啥?
PSI 是 Program Structure Interface 的簡寫。從名字能夠看出來它是一個接口,至關於把項目中的一切都封裝了起來,好比類、方法、語句等,讓他們都成爲了同一個系統內的實現。封裝的對象類都統一加了個前綴好比PsiClass、PsiMethod等。
若是學過Dom和Parse解析就很好理解了,Virtual File就是xml文件自己的一個抽象對象。而PSI File就相似於Dom下xml文件解析成的Document對象,雖然也是「文件」,可是特殊封裝過的~ 這個PsiFile是整個PSI系統下的文件對象,和PSI下的其餘Element元素相通~
PSI Element是PSI系統下不一樣類型對象的一個統稱,是基類。
好比以前提到的PsiMethod、PsiClass等等都是一個個具體的PsiElement實現。
可能還會有點迷惑,下面寫個demo幫助理解。
咱們經過ActionEvent的getData方法,傳入對應KEY獲取PsiFile(Action類建立參考上篇教程),而後遍歷PsiFile文件下全部的子級元素,打印出來(日誌顯示在開發插件的IDE的控制檯)
注意,這個直接獲取的PsiFile默認爲當前咱們當前所選的文件
@Override
public void actionPerformed(AnActionEvent e) {
PsiFile file = e.getData(PlatformDataKeys.PSI_FILE);
for (PsiElement psiElement : file.getChildren()) {
System.out.println(psiElement);
}
}複製代碼
代碼run起來
運行起來的IDE咱們新建一個Android Project,默認主頁面代碼以下
而後在菜單中 Code | Database Generate 調用咱們編寫的插件
運行結果日誌以下:
PsiPackageStatement:com.boredream.plugindemo
PsiWhiteSpace
PsiImportList
PsiWhiteSpace
PsiClass:MainActivity
PsiWhiteSpace
這裏把MainActivity文件下全部的子級Element都列出來了(只遍歷直接子級)
看名字就能知道意思,PsiPackageStatement是包名語句,PsiClass是類。。。甚至還有PsiWhiteSpace,空白都專門有個類型啊!細緻!
這裏不一樣的Element還有本身對應的特殊方法,好比PsiClass就和Java中的Class相似,能夠獲取Field、Method等。下面咱們再簡單改造下Demo,獲取MainActivity文件中Class裏面的元素。
@Override
public void actionPerformed(AnActionEvent e) {
PsiFile file = e.getData(PlatformDataKeys.PSI_FILE);
for (PsiElement psiElement : file.getChildren()) {
if(psiElement instanceof PsiClass) {
PsiClass clazz = (PsiClass) psiElement;
PsiMethod method = clazz.getMethods()[0];
System.out.println(method.getName());
System.out.println(method.getParameterList().getText());
}
}
}複製代碼
一樣,再次run項目,而後調用插件
運行結果日誌以下:
onCreate
(Bundle savedInstanceState)
此次咱們遍歷獲取了PsiClass類對象,而後獲取它內部的第一個方法,並打印方法的名字和方法參數的文字
本篇教程結束~
下一章,咱們將開擼 自動生成數據庫插件代碼的實戰~而後一邊寫插件一邊再學習新的內容