Android Studio Plugin 插件開發教程(二) —— 插件SDK中的經常使用對象介紹

項目源碼

github.com/boredream/A…java

系列教程

Android Studio Plugin 插件開發教程(一) —— 開發你的第一個插件git

Android Studio Plugin 插件開發教程(二) —— 插件SDK中的經常使用對象介紹github

Android Studio Plugin 插件開發教程(三) —— 製做一個自動生成數據庫代碼的插件數據庫

Android Studio Plugin 插件開發教程(四) —— 爲自動生成數據庫代碼的插件添加UIide


先樹立一個概念,AS裏項目的一切均可以視爲對象,好比整個項目,項目裏的每一個文件,文件裏的每一個方法、每行語句等等都是一個對象。咱們插件SDK的開發,主要工做就是針對這一個個的對象的分析和處理post

下面開始介紹幾個主要的對象類學習

Virtual File

虛擬文件類。
能夠當作Java開發中的File對象理解,概念比較相似測試

獲取方法

  • 經過Action獲取: event.getData(PlatformDataKeys.VIRTUAL_FILE).
    這個也是以前教程(一)中的獲取方法
  • 經過本地文件路徑獲取: LocalFileSystem.getInstance().findFileByIoFile()
  • 經過PSI file獲取: psiFile.getVirtualFile()
  • 經過document獲取: FileDocumentManager.getInstance().getFile()

用處

傳統的文件操做方法這個對象都支持,好比獲取文件內容,重命名,移動,刪除等spa


PSI File

PSI系統下的文件類。插件

獲取方法

  • 經過Action獲取: e.getData(LangDataKeys.PSI_FILE).
  • 經過VirtualFile獲取: PsiManager.getInstance(project).findFile()
  • 經過document獲取: PsiDocumentManager.getInstance(project).getPsiFile()
  • 經過文件中的Element元素獲取: psiElement.getContainingFile()
    若是要經過名字獲取,請使用 FilenameIndex.getFilesByName(project, name, scope)

用處

做爲PSI系統中的一個元素,可使用PSI Element的各類具體方法


看到這裏確定不少人一臉迷惑,這倆File有啥區別?PSI是啥?Element又是啥?

什麼是PSI系統?

PSI 是 Program Structure Interface 的簡寫。從名字能夠看出來它是一個接口,至關於把項目中的一切都封裝了起來,好比類、方法、語句等,讓他們都成爲了同一個系統內的實現。封裝的對象類都統一加了個前綴好比PsiClass、PsiMethod等。

Virtual File 和 PSI File的區別?

若是學過Dom和Parse解析就很好理解了,Virtual File就是xml文件自己的一個抽象對象。而PSI File就相似於Dom下xml文件解析成的Document對象,雖然也是「文件」,可是特殊封裝過的~ 這個PsiFile是整個PSI系統下的文件對象,和PSI下的其餘Element元素相通~

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類對象,而後獲取它內部的第一個方法,並打印方法的名字和方法參數的文字

本篇教程結束~
下一章,咱們將開擼 自動生成數據庫插件代碼的實戰~而後一邊寫插件一邊再學習新的內容

相關文章
相關標籤/搜索