![eclipse插件開發(fā)-JDT[分享借鑒]_第1頁](http://file1.renrendoc.com/fileroot_temp2/2020-10/5/196cee0e-0584-44ae-b8fc-54868a046487/196cee0e-0584-44ae-b8fc-54868a0464871.gif)
![eclipse插件開發(fā)-JDT[分享借鑒]_第2頁](http://file1.renrendoc.com/fileroot_temp2/2020-10/5/196cee0e-0584-44ae-b8fc-54868a046487/196cee0e-0584-44ae-b8fc-54868a0464872.gif)
![eclipse插件開發(fā)-JDT[分享借鑒]_第3頁](http://file1.renrendoc.com/fileroot_temp2/2020-10/5/196cee0e-0584-44ae-b8fc-54868a046487/196cee0e-0584-44ae-b8fc-54868a0464873.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JDT核心JDT 核心JDT 核心(org.eclipse.jdt.core)是用于定義 Java 核心元素和 API 的插件。在開發(fā)特定于 Java 的功能部件時(shí),總是應(yīng)該將此插件列示為先決條件。JDT 核心包使您能夠訪問 Java 模型對(duì)象和無外設(shè) Java IDE 基礎(chǔ)結(jié)構(gòu)。JDT 核心包包括: org.eclipse.jdt.core 定義用于描述 Java 模型的類。 piler 定義編譯器基礎(chǔ)結(jié)構(gòu)的 API。 org.eclipse.jdt.core.dom 支持可用于檢查編譯單元的結(jié)構(gòu)直到語句級(jí)別的“抽象語法樹”(AST)。 org
2、.eclipse.jdt.core.eval 支持對(duì)代碼片段編輯測(cè)試窗或調(diào)試器中的代碼段進(jìn)行評(píng)估。 org.eclipse.jdt.core.jdom 支持 Java“文檔對(duì)象模型”(DOM),它可用于表示 Java 編譯單元的結(jié)構(gòu)。 org.eclipse.jdt.core.search 支持在工作空間的 Java 模型中搜索與特定描述相匹配的 Java 元素。 org.eclipse.jdt.core.util 提供用于處理 .class 文件和 Java 模型元素的實(shí)用程序類。 從版本 3.0 起,建議不要使用 org.eclipse.jdt.core.jdom。應(yīng)使用 org.ecli
3、pse.jdt.core.dom 來完成對(duì)編譯單元的結(jié)構(gòu)的處理。Java 模型Java 模型是用來對(duì)與創(chuàng)建、編輯和構(gòu)建 Java 程序相關(guān)聯(lián)的對(duì)象進(jìn)行建模的一些類。Java 模型類是在 org.eclipse.jdt.core 中定義的。這些類實(shí)現(xiàn)資源的特定于 Java 的行為,并進(jìn)一步將 Java 資源分解成模型元素。Java 元素包 org.eclipse.jdt.core 定義了用來對(duì)組成 Java 程序的元素建模的一些類。JDT 使用內(nèi)存中的對(duì)象模型來表示 Java 程序的結(jié)構(gòu)。此結(jié)構(gòu)是從項(xiàng)目的類路徑派生的。模型是分層的??梢詫⒊绦虻脑胤纸獬勺釉亍L幚?Java 元素與處理資源對(duì)象
4、相似。當(dāng)使用 Java 元素時(shí),實(shí)際上是在使用某些底層的模型對(duì)象的句柄。必須使用 exists() 協(xié)議來確定元素是否真正存在于工作空間中。下表總結(jié)了不同種類的 Java 元素。元素描述IJavaModel表示根 Java 元素,對(duì)應(yīng)于工作空間。所有具有 Java 性質(zhì)的項(xiàng)目的父代。它還允許訪問不具有 java 性質(zhì)的項(xiàng)目。IJavaProject表示工作空間中的 Java 項(xiàng)目。(IJavaModel 的子代)IPackageFragmentRoot表示一組包段,并將各段映射至底層資源,它可以是文件夾、JAR 或 ZIP 文件。(IJavaProject 的子代)IPackageFragme
5、nt表示工作空間中的一個(gè)部分,對(duì)應(yīng)于整個(gè)包或者包的一部分。(IPackageFragmentRoot 的子代)ICompilationUnit表示 Java 源(.java)文件。(IPackageFragment 的子代)IPackageDeclaration表示編譯單元中的軟件包聲明。(ICompilationUnit 的子代)IImportContainer表示編譯單元中的包導(dǎo)入聲明的集合。(ICompilationUnit 的子代)IImportDeclaration表示單個(gè)包導(dǎo)入聲明。(IImportContainer 的子代)IType表示編譯單元內(nèi)的源類型,或者是類文件中的二進(jìn)制
6、類型。IField表示類型中的字段。(IType 的子代)IMethod表示類型中的方法或構(gòu)造函數(shù)。(IType 的子代)IInitializer表示類型中的靜態(tài)或?qū)嵗跏蓟椒ā#↖Type 的子代)IClassFile表示已編譯(二進(jìn)制)類型。(IPackageFragment 的子代)ITypeParameter 表示類型參數(shù)。(不是任何 Java 元素的子元素,可使用 IType.getTypeParameter(String) 或 IMethod.getTypeParameter(String) 獲得)ILocalVariable 表示方法或初始化方法中的局部變量。(不是任何 Jav
7、a 元素的子元素,可使用 ICodeAssist.codeSelect(int, int) 獲得)所有 Java 元素都支持 IJavaElement 接口。某些元素顯示在“包”視圖中。這些元素實(shí)現(xiàn) IOpenable 接口,原因是必須在打開它們之后才能瀏覽它們。下圖說明這些元素在“包”視圖中是如何表示的。實(shí)現(xiàn) IOpenable 的 Java 元素基本上是根據(jù)在底層資源文件中找到的信息創(chuàng)建的。相同的元素是在資源導(dǎo)航器視圖中按類別表示的。 其他元素對(duì)應(yīng)于組成 Java 編譯單元的項(xiàng)。下圖顯示 Java 編譯單元和內(nèi)容大綱窗口(它顯示編譯單元中的源元素)。 因?yàn)檫@些元素可以提供相應(yīng)的源代碼,所以
8、它們實(shí)現(xiàn)了 ISourceReference 接口。(當(dāng)在內(nèi)容大綱窗口中選擇了這些元素時(shí),就會(huì)在 Java 編輯器中顯示它們相應(yīng)的源代碼)。Java 元素及其資源許多 Java 元素對(duì)應(yīng)于工作空間中的通用資源。當(dāng)您想根據(jù)通用資源來創(chuàng)建 Java 元素時(shí),最好是從類 JavaCore 開始。以下代碼段說明如何從 Java 元素的相應(yīng)資源中獲取 Java 元素。 private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) IJavaProject myJavaProject = Ja
9、vaCore.create(myProject); if (myJavaProject = null) / the project is not configured for Java (has no Java nature) return; / get a package fragment or package fragment root IJavaElement myPackageFragment = JavaCore.create(myFolder); / get a .java (compilation unit), .class (class file), or / .jar (pa
10、ckage fragment root) IJavaElement myJavaFile = JavaCore.create(myFile); 一旦有了 Java 元素,就可以使用 JDT API 來遍歷和查詢模型。還可以查詢包含在 Java 元素內(nèi)的非 Java 資源。 private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) . / get the non Java resources contained in my project. Object nonJavaChild
11、ren = myJavaProject.getNonJavaResources(); . Java 項(xiàng)目當(dāng)根據(jù)簡(jiǎn)單項(xiàng)目來創(chuàng)建 Java 項(xiàng)目時(shí),JavaCore 將檢查項(xiàng)目是否是用 Java 性質(zhì)來配置的。JDT 插件使用項(xiàng)目性質(zhì)來將項(xiàng)目指定為具有 Java 行為。當(dāng)“新建 Java 項(xiàng)目”向?qū)?chuàng)建項(xiàng)目時(shí),將為項(xiàng)目指定此性質(zhì)(org.eclipse.jdt.core.JavaCore#NATURE_ID)。如果未對(duì)項(xiàng)目配置 Java 性質(zhì),則在要求創(chuàng)建項(xiàng)目時(shí),JavaCore 將返回 null。JavaCore 還用來維護(hù) Java 類路徑,包括用于查找源代碼和庫的位置以及用于生成輸出二進(jìn)制(
12、.class)文件的位置。什么是 Java 項(xiàng)目的唯一特征?Java 項(xiàng)目將它們的類路徑記錄在“.classpath”文件中,并將 Java 增量項(xiàng)目構(gòu)建器添加到項(xiàng)目的構(gòu)建規(guī)范中。否則,它們只是常規(guī)項(xiàng)目,并且可以由插件利用其他性質(zhì)(和其他增量構(gòu)建器)來配置。對(duì)于那些想要利用除了它們自己的行為之外的 Java 行為來配置項(xiàng)目的插件,它們通常使用 NewJavaProjectWizardPage 來為項(xiàng)目指定除了它們自己的定制性質(zhì)或行為之外的 Java 性質(zhì)。IJavaModel 可以認(rèn)為是工作空間中具有 Java 項(xiàng)目性質(zhì)的所有項(xiàng)目的父代(因此,可以當(dāng)作 IJavaProject)。處理 Jav
13、a 代碼插件可以使用 JDT API 來創(chuàng)建類或接口、將方法添加到現(xiàn)有類型中或者改變方法的類型。改變 Java 對(duì)象最簡(jiǎn)單的方法就是使用 Java 元素 API??梢允褂酶R姷募夹g(shù)來處理 Java 元素的初始源代碼。使用 Java 元素來修改代碼生成編譯單元 通過程序來生成編譯單元最簡(jiǎn)單的方法是使用 IPackageFragment.createCompilationUnit。指定編譯單元的名稱和內(nèi)容。于是在包中創(chuàng)建了編譯單元,并返回新的 ICompilationUnit。通常,可以通過在對(duì)應(yīng)包目錄的相應(yīng)文件夾中創(chuàng)建擴(kuò)展名為“.java”的文件資源來按類別創(chuàng)建編譯單元。使用類屬資源 API
14、對(duì)于 Java 工具是一種旁門左道,因此,在通知類屬資源更改偵聽器以及 JDT 偵聽器將 Java 模型更新為新編譯單元之前,Java 模型不會(huì)更新。修改編譯單元 大部分對(duì) Java 源代碼的簡(jiǎn)單修改可以使用 Java 元素 API 來完成。例如,可以通過編譯單元查詢類型。一旦您具有 IType,就可以使用諸如 createField、createInitializer、createMethod 或 createType 的協(xié)議來將源代碼成員添加至類型。在這些方法中提供了源代碼以及關(guān)于成員的位置的信息。ISourceManipulation 接口定義 Java 元素的常見源代碼處理。這包括用于
15、重命名、移動(dòng)、復(fù)制或刪除類型的成員的方法。工作副本 可以通過處理編譯單元來修改代碼(于是修改了底層 IFile)或人們可以修改編譯單元的內(nèi)存副本(稱為工作副本)。工作副本是使用 getWorkingCopy 方法從編譯單元中獲取的。(注意,要?jiǎng)?chuàng)建工作副本,編譯單元不需要存在于 Java 模型中。)當(dāng)不再需要這種工作副本時(shí),創(chuàng)建這種工作副本的人員應(yīng)負(fù)責(zé)使用 discardWorkingCopy 方法來廢棄它。工作副本修改內(nèi)存緩沖區(qū)。getWorkingCopy() 方法創(chuàng)建缺省緩沖區(qū),但是客戶機(jī)可以使用 getWorkingCopy(WorkingCopyOwner, IProblemReque
16、stor, IProgressMonitor) 方法提供它們自己的緩沖區(qū)實(shí)現(xiàn)??蛻魴C(jī)可以直接處理此緩沖區(qū)的文本。如果客戶機(jī)直接處理文本,則它們必須經(jīng)常使用 reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor) 方法來使工作副本與緩沖區(qū)同步。最后,可以使用 commitWorkingCopy 方法將工作副本保存至磁盤(用來替換原始的編譯單元)。 例如,下列代碼段使用定制工作副本擁有者在編譯單元上創(chuàng)建工作副本。該代碼段將修改緩沖區(qū)、協(xié)調(diào)更改、將更改落實(shí)到磁盤,最后廢棄工作副本。 / Get original compilation
17、unit ICompilationUnit originalUnit = .; / Get working copy owner WorkingCopyOwner owner = .; / Create working copy ICompilationUnit workingCopy = originalUnit.getWorkingCopy(owner, null, null); / Modify buffer and reconcile IBuffer buffer = (IOpenable)workingCopy).getBuffer(); buffer.append(class X
18、); workingCopy.reconcile(NO_AST, false, null, null); / Commit changes workingCmitWorkingCopy(false, null); / Destroy working copy workingCopy.discardWorkingCopy();工作副本還可以供若干使用工作副本擁有者的客戶機(jī)共享。稍后可以使用 findWorkingCopy 方法來檢索工作副本。因此,對(duì)于原始編譯單元和工作副本擁有者,共享工作副本很重要。下列內(nèi)容說明了客戶機(jī) 1 如何創(chuàng)建共享的工作副本、客戶機(jī) 2 如何檢索此工作副本、
19、客戶機(jī) 1 如何廢棄此工作副本以及嘗試檢索共享的工作副本的客戶機(jī) 2 如何注意到該工作副本不再存在: / Client 1 & 2: Get original compilation unit ICompilationUnit originalUnit = .; / Client 1 & 2: Get working copy owner WorkingCopyOwner owner = .; / Client 1: Create shared working copy ICompilationUnit workingCopyForClient1 = originalUnit.getWorki
20、ngCopy(owner, null, null); / Client 2: Retrieve shared working copy ICompilationUnit workingCopyForClient2 = originalUnit.findWorkingCopy(owner); / This is the same working copy assert workingCopyForClient1 = workingCopyForClient2; / Client 1: Discard shared working copy workingCopyForClient1.discar
21、dWorkingCopy(); / Client 2: Attempt to retrieve shared working copy and find out its null workingCopyForClient2 = originalUnit.findWorkingCopy(owner); assert workingCopyForClient2 = null;使用 DOM/AST API 來修改代碼有三種方法來創(chuàng)建 CompilationUnit。第一種方法是使用 ASTParser。第二種方法是使用 ICompilationUnit#reconcile(.)。第三種方法是從頭開始
22、對(duì) AST(抽象語法樹)使用工廠方法。 從現(xiàn)有的源代碼創(chuàng)建 AST必須使用 ASTParser.newParser(int) 來創(chuàng)建 ASTParser 的實(shí)例。將使用下列其中一個(gè)方法將源代碼提供給 ASTParser: setSource(char):從源代碼創(chuàng)建 AST setSource(IClassFile):從類文件創(chuàng)建 AST setSource(ICompilationUnit):從編譯單元?jiǎng)?chuàng)建 AST 然后通過調(diào)用 createAST(IProgressMonitor) 來創(chuàng)建 AST。結(jié)果是每個(gè)節(jié)點(diǎn)都有一個(gè)具有正確源位置的 AST。在使用 setResolveBindings
23、(boolean) 創(chuàng)建樹之前,必須請(qǐng)求綁定的解決方案。解決綁定是一個(gè)成本很高的操作,僅當(dāng)需要時(shí)才執(zhí)行。一旦修改了樹,就會(huì)丟失所有位置和綁定。 通過協(xié)調(diào)工作副本來創(chuàng)建 AST 如果工作副本不一致(已修改),則可以通過調(diào)用方法 reconcile(int, boolean, org.eclipse.jdt.core.WorkingCopyOwner, org.eclipse.core.runtime.IProgressMonitor) 來創(chuàng)建 AST。要請(qǐng)求 AST 創(chuàng)建,使用 AST.JLS2 作為第一個(gè)參數(shù)來調(diào)用 reconcile(.) 方法。僅當(dāng)問題請(qǐng)求程序是活動(dòng)或者當(dāng)強(qiáng)制執(zhí)行問題檢測(cè)時(shí)
24、,才會(huì)計(jì)算其綁定。解決綁定是一個(gè)成本很高的操作,僅當(dāng)需要時(shí)才執(zhí)行。一旦修改了樹,就會(huì)丟失所有位置和綁定。 從頭開始 可以通過對(duì) AST 使用工廠方法來從頭創(chuàng)建 CompilationUnit。這些方法名以 new. 開頭。以下是創(chuàng)建 HelloWorld 類的一個(gè)示例。第一個(gè)代碼段是生成的輸出: package example; import java.util.*; public class HelloWorld public static void main(String args) System.out.println(Hello + world);下列代碼段是生成輸出的相應(yīng)代碼。 AS
25、T ast = new AST();CompilationUnit unit = ast.newCompilationUnit();PackageDeclaration packageDeclaration = ast.newPackageDeclaration();packageDeclaration.setName(ast.newSimpleName(example);unit.setPackage(packageDeclaration);ImportDeclaration importDeclaration = ast.newImportDeclaration();QualifiedNa
26、me name =ast.newQualifiedName(ast.newSimpleName(java),ast.newSimpleName(util);importDeclaration.setName(name);importDeclaration.setOnDemand(true);unit.imports().add(importDeclaration);TypeDeclaration type = ast.newTypeDeclaration();type.setInterface(false);type.setModifiers(Modifier.PUBLIC);type.set
27、Name(ast.newSimpleName(HelloWorld);MethodDeclaration methodDeclaration = ast.newMethodDeclaration();methodDeclaration.setConstructor(false);methodDeclaration.setModifiers(Modifier.PUBLIC | Modifier.STATIC);methodDeclaration.setName(ast.newSimpleName(main);methodDeclaration.setReturnType(ast.newPrimi
28、tiveType(PrimitiveType.VOID);SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();variableDeclaration.setModifiers(Modifier.NONE);variableDeclaration.setType(ast.newArrayType(ast.newSimpleType(ast.newSimpleName(String);variableDeclaration.setName(ast.newSimpleName(args)
29、;methodDeclaration.parameters().add(variableDeclaration);org.eclipse.jdt.core.dom.Block block = ast.newBlock();MethodInvocation methodInvocation = ast.newMethodInvocation();name = ast.newQualifiedName(ast.newSimpleName(System),ast.newSimpleName(out);methodInvocation.setExpression(name);methodInvocat
30、ion.setName(ast.newSimpleName(println);InfixExpression infixExpression = ast.newInfixExpression();infixExpression.setOperator(InfixExpression.Operator.PLUS);StringLiteral literal = ast.newStringLiteral();literal.setLiteralValue(Hello);infixExpression.setLeftOperand(literal);literal = ast.newStringLi
31、teral();literal.setLiteralValue( world);infixExpression.setRightOperand(literal);methodInvocation.arguments().add(infixExpression);ExpressionStatement expressionStatement = ast.newExpressionStatement(methodInvocation);block.statements().add(expressionStatement);methodDeclaration.setBody(block);type.
32、bodyDeclarations().add(methodDeclaration);unit.types().add(type);檢索額外的位置DOM/AST 節(jié)點(diǎn)只包含一對(duì)位置(起始位置和節(jié)點(diǎn)的長度)。這并不總是夠用。要檢索中間位置,應(yīng)使用 IScanner API。例如,我們具有想要對(duì)其了解 instanceof 運(yùn)算符的位置的 InstanceofExpression。可以編寫以下方法來實(shí)現(xiàn)此目的: private int getOperatorPosition(Expression expression, char source) if (expression instanceof I
33、nstanceofExpression) IScanner scanner = ToolFactory.createScanner(false, false, false, false);scanner.setSource(source);int start = expression.getStartPosition();int end = start + expression.getLength();scanner.resetTo(start, end);int token;try while (token = scanner.getNextToken() != ITerminalSymbo
34、ls.TokenNameEOF) switch(token) case ITerminalSymbols.TokenNameinstanceof:return new int scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(); catch (InvalidInputException e) return null;IScanner 用來將輸入源代碼分成多個(gè)標(biāo)記。每個(gè)標(biāo)記都具有特定值,這些特定值是在 ITerminalSymbols 接口中定義的。迭代和檢索正確的標(biāo)記是非常簡(jiǎn)單的。如果想要在
35、SuperMethodInvocation 中查找 super 關(guān)鍵字的位置,則還建議您使用掃描程序。 源代碼修改某些源代碼修改不是通過 Java 元素 API 來提供的。編輯源代碼(例如,更改現(xiàn)有元素的源代碼)的較常見方法是使用編譯單元的初始源代碼和 DOM/AST 的重寫 API 來完成的。要執(zhí)行 DOM/AST 重寫,存在兩組 API:描述性重寫和修改重寫。 描述性 API 不修改 AST,而是使用 ASTRewrite API 來生成修改描述。AST 重寫程序收集對(duì)節(jié)點(diǎn)修改的描述并將這些描述轉(zhuǎn)換為可以適用于初始源代碼的文本編輯。 / creation of a Document ICo
36、mpilationUnit cu = . ; / content is public class X n String source = cu.getBuffer().getContents(); Document document= new Document(source); / creation of DOM/AST from a ICompilationUnit ASTParser parser = ASTParser.newParser(AST.JLS2); parser.setSource(cu); CompilationUnit astRoot = (CompilationUnit
37、) parser.createAST(null); / creation of ASTRewrite ASTRewrite rewrite = new ASTRewrite(astRoot.getAST(); / description of the change SimpleName oldName = (TypeDeclaration)astRoot.types().get(0).getName(); SimpleName newName = astRoot.getAST().newSimpleName(Y); rewrite.replace(oldName, newName, null)
38、; / computation of the text edits TextEdit edits = rewrite.rewriteAST(document, cu.getJavaProject().getOptions(true); / computation of the new source code edits.apply(document); String newSource = document.get(); / update of the compilation unit cu.getBuffer().setContents(newSource);修改 API 允許直接修改 AS
39、T: 請(qǐng)求記錄修改(CompilationUnit.recordModifications())。 對(duì) AST 節(jié)點(diǎn)執(zhí)行修改。 當(dāng)完成修改時(shí),生成可以適用于初始源代碼的文本編輯(CompilationUnit.rewrite(.))。 / creation of a Document ICompilationUnit cu = . ; / content is public class X n String source = cu.getBuffer().getContents(); Document document= new Document(source); / creation of
40、DOM/AST from a ICompilationUnit ASTParser parser = ASTParser.newParser(AST.JLS2); parser.setSource(cu); CompilationUnit astRoot = (CompilationUnit) parser.createAST(null); / start record of the modifications astRoot.recordModifications(); / modify the AST TypeDeclaration typeDeclaration = (TypeDecla
41、ration)astRoot.types().get(0) SimpleName newName = astRoot.getAST().newSimpleName(Y); typeDeclaration.setName(newName); / computation of the text edits TextEdit edits = astRoot.rewrite(document, cu.getJavaProject().getOptions(true); / computation of the new source code edits.apply(document); String
42、newSource = document.get(); / update of the compilation unit cu.getBuffer().setContents(newSource);對(duì) Java 元素的更改作出響應(yīng)如果事后插件需要知道對(duì) Java 元素所作的更改,則可以向 JavaCore 注冊(cè) Java IElementChangedListener。 JavaCore.addElementChangedListener(new MyJavaElementChangeReporter();還可以更具體,并使用 addElementChangedListener(IElemen
43、tChangedListener, int) 來指定您感興趣的事件的類型。例如,如果您只想在協(xié)調(diào)操作期間偵聽事件: JavaCore.addElementChangedListener(new MyJavaElementChangeReporter(), ElementChangedEvent.POST_RECONCILE);JavaCore 支持二種類型的事件: POST_CHANGE:在相應(yīng)的 POST_CHANGE 資源更改通知期間,將通知此事件類型的偵聽器。 POST_RECONCILE:在結(jié)束對(duì)工作副本的協(xié)調(diào)操作時(shí),將通知此事件類型的偵聽器(請(qǐng)參閱 ICompilationUnit.
44、reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor))。 Java 元素更改偵聽器在概念上類似于資源更改偵聽器(在跟蹤資源更改中進(jìn)行了描述)。下列代碼段實(shí)現(xiàn) Java 元素更改指示器,它將元素變化打印到系統(tǒng)控制臺(tái)中。public class MyJavaElementChangeReporter implements IElementChangedListener public void elementChanged(ElementChangedEvent event) IJavaElementDelta delta= even
45、t.getDelta(); if (delta != null) System.out.println(delta received: ); System.out.print(delta); IJavaElementDelta 包括已更改的元素和描述所發(fā)生的更改類型的標(biāo)志。在大多數(shù)時(shí)候,delta 樹的根位于“Java 模型”級(jí)別。然后,客戶機(jī)必須使用 getAffectedChildren 來瀏覽此 delta 以了解已經(jīng)更改了哪些項(xiàng)目。以下示例方法遍歷 delta,并打印已添加、已除去和已更改的元素: void traverseAndPrint(IJavaElementDelta delt
46、a) switch (delta.getKind() case IJavaElementDelta.ADDED: System.out.println(delta.getElement() + was added); break; case IJavaElementDelta.REMOVED: System.out.println(delta.getElement() + was removed); break; case IJavaElementDelta.CHANGED: System.out.println(delta.getElement() + was changed); if (d
47、elta.getFlags() & IJavaElementDelta.F_CHILDREN) != 0) System.out.println(The change was in its children); if (delta.getFlags() & IJavaElementDelta.F_CONTENT) != 0) System.out.println(The change was in its content); /* Others flags can also be checked */ break; IJavaElementDelta children = delta.getA
48、ffectedChildren(); for (int i = 0; i children.length; i+) traverseAndPrint(childreni); 有多種操作可以觸發(fā) Java 元素更改通知。以下是一些示例: 創(chuàng)建資源,例如 IPackageFragment.createCompilationUnit(delta 指示編譯單元的添加) 修改資源,例如 ICompilationUnit.createType(delta 指示編譯單元已更改,并且已添加類型來作為此編譯單元的子代) 修改項(xiàng)目的類路徑,例如 IJavaProject.setRawClasspath(delta
49、 指示包段根目錄已添加至類路徑、已從類路徑中除去或在類路徑上已重新排序) 修改類路徑變量值,例如 JavaCore.setClasspathVariable(delta 還指示包段根目錄已經(jīng)受到影響) 更改 .jar 文件的源代碼連接,例如 IPackageFragmentRoot.attachSource(delta 指示源已拆離,然后連接) 使工作副本與它的緩沖區(qū)協(xié)調(diào),例如 IWorkingCopy.reconcile 修改以“.java”結(jié)尾并且在項(xiàng)目的類路徑上的 IFile,例如,使用 IFile.setContents(delta 指示編譯單元已更改,但是未提供更詳細(xì)的信息,原因是這
50、不是通過“Java 模型”操作來完成的) 與 IResourceDelta 相似,可以使用 IWorkspaceRunnable 來對(duì) Java 元素 delta 進(jìn)行批處理。立即就會(huì)合并和報(bào)告在 IWorkspaceRunnable 中運(yùn)行的若干“Java 模型”操作產(chǎn)生的 delta。 JavaCore 提供了 run 方法來對(duì) Java 元素更改進(jìn)行批處理。例如,以下代碼段將觸發(fā)兩個(gè) Java 元素更改事件: / Get package IPackageFragment pkg = .; / Create 2 compilation units ICompilationUnit unit
51、A = pkg.createCompilationUnit(A.java, public class A , false, null); ICompilationUnit unitB = pkg.createCompilationUnit(B.java, public class B , false, null);而以下代碼段將觸發(fā) 1 個(gè) Java 元素更改事件: / Get package IPackageFragment pkg = .; / Create 2 compilation units JavaCore.run( new IWorkspaceRunnable() public
52、void run(IProgressMonitor monitor) throws CoreException ICompilationUnit unitA = pkg.createCompilationUnit(A.java, public class A , false, null); ICompilationUnit unitB = pkg.createCompilationUnit(B.java, public class B , false, null); , null);設(shè)置 Java 構(gòu)建路徑本節(jié)描述如何設(shè)置 Java 構(gòu)建路徑。構(gòu)建路徑是用于構(gòu)建 Java 項(xiàng)目(IJavaPr
53、oject)的類路徑。類路徑只是一組用于描述可用類型的類路徑條目(IClassPathEntry)。類型能夠以源或二進(jìn)制格式出現(xiàn),并且條目在路徑中的順序定義了用于在構(gòu)建期間解析類型的查找順序。Java 構(gòu)建路徑反映在 Java 項(xiàng)目元素的結(jié)構(gòu)中。可以查詢項(xiàng)目的包段根目錄(IPackageFragmentRoot)。每個(gè)類路徑條目都映射至一個(gè)或多個(gè)包段根目錄,每個(gè)包段根目錄進(jìn)一步包含一組包段。此處對(duì)構(gòu)建路徑的討論不涉及 Java 運(yùn)行時(shí)路徑,Java 運(yùn)行時(shí)路徑可以獨(dú)立于構(gòu)建路徑進(jìn)行定義。(有關(guān)運(yùn)行時(shí)類路徑的討論,請(qǐng)參閱運(yùn)行 Java 代碼。)更改構(gòu)建路徑可以通過對(duì)相應(yīng)項(xiàng)目的 Java 元素使用 setRawClasspath 來使用程序更改項(xiàng)目的構(gòu)建路徑。以下代碼設(shè)置項(xiàng)目資源的類路徑: IProject project = . / get some project resou
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新部編版一年級(jí)語文上多媒體教學(xué)計(jì)劃
- 湖南電子功能性器件項(xiàng)目可行性研究報(bào)告范文模板
- 美術(shù)四年級(jí)上冊(cè)教學(xué)進(jìn)度安排計(jì)劃
- 一年級(jí)體育文化交流計(jì)劃
- 軟件信息服務(wù)業(yè)IT解決方案創(chuàng)新與發(fā)展方向探討
- 校園小程序創(chuàng)業(yè)計(jì)劃書范文
- 2025-2030年中國碳復(fù)寫紙項(xiàng)目投資可行性研究分析報(bào)告
- 2024年全球及中國開口扳手行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年度客戶服務(wù)提升總結(jié)及2025年工作計(jì)劃
- 河北戶外LED照明產(chǎn)品項(xiàng)目投資分析報(bào)告
- 建筑工地值班制度
- 《中央八項(xiàng)規(guī)定精神學(xué)習(xí)教育》專項(xiàng)講座
- Unit 6 Topic 2 Section C 課件 -2024-2025學(xué)年仁愛科普版八年級(jí)英語下冊(cè)
- 中國近現(xiàn)代史綱要學(xué)習(xí)心得體會(huì)與民族團(tuán)結(jié)
- 2022年北京市初三一模道德與法治試題匯編:守望精神家園
- 2025年修訂版二手房買賣協(xié)議
- 2025山東文旅云智能科技限公司招聘19人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 勞務(wù)派遣公司管理制度
- 承德縣80兆瓦光伏發(fā)電項(xiàng)目安全文明施工實(shí)施細(xì)則
- 工程信號(hào)基礎(chǔ)
- 年度產(chǎn)品研發(fā)計(jì)劃表
評(píng)論
0/150
提交評(píng)論