eclipse插件開發(fā)JDT_第1頁
eclipse插件開發(fā)JDT_第2頁
eclipse插件開發(fā)JDT_第3頁
eclipse插件開發(fā)JDT_第4頁
eclipse插件開發(fā)JDT_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JDT核心JDT 核心JDT 核心()是用于定義 Java 核心元素和 API 的插件。在開發(fā)特定于 Java 的功能部件時(shí),總是應(yīng)該將此插件列示為先決條件。JDT 核心包使您能夠訪問 Java 模型對象和無外設(shè) Java IDE 基礎(chǔ)結(jié)構(gòu)。JDT 核心包包括:  · 定義用于描述 Java 模型的類。 · 定義編譯器基礎(chǔ)結(jié)構(gòu)的 API。 · 支持可用于檢查編譯單元的結(jié)構(gòu)直到語句級別的“抽象語法樹”(AST)。 · 支持對代碼片段編輯測試窗或調(diào)試器中的代碼段進(jìn)行評估。 · 支持 Java“文檔對象模型”(DOM),它可用于表示 Jav

2、a 編譯單元的結(jié)構(gòu)。 · 支持在工作空間的 Java 模型中搜索與特定描述相匹配的 Java 元素。   · 提供用于處理 .class 文件和 Java 模型元素的實(shí)用程序類。 從版本 3.0 起,建議不要使用 。應(yīng)使用 來完成對編譯單元的結(jié)構(gòu)的處理。Java 模型Java 模型是用來對與創(chuàng)建、編輯和構(gòu)建 Java 程序相關(guān)聯(lián)的對象進(jìn)行建模的一些類。Java 模型類是在 中定義的。這些類實(shí)現(xiàn)資源的特定于 Java 的行為,并進(jìn)一步將 Java 資源分解成模型元素。Java 元素包 定義了用來對組成 Java 程序的元素建模的一些類。JDT 使用內(nèi)存中的

3、對象模型來表示 Java 程序的結(jié)構(gòu)。此結(jié)構(gòu)是從項(xiàng)目的類路徑派生的。模型是分層的。可以將程序的元素分解成子元素。處理 Java 元素與處理資源對象相似。當(dāng)使用 Java 元素時(shí),實(shí)際上是在使用某些底層的模型對象的句柄。必須使用 exists() 協(xié)議來確定元素是否真正存在于工作空間中。 下表總結(jié)了不同種類的 Java 元素。元素描述IJavaModel表示根 Java 元素,對應(yīng)于工作空間。所有具有 Java 性質(zhì)的項(xiàng)目的父代。它還允許訪問不具有 java 性質(zhì)的項(xiàng)目。IJavaProject表示工作空間中的 Java 項(xiàng)目。(IJavaModel 的子代)IPackageFragm

4、entRoot表示一組包段,并將各段映射至底層資源,它可以是文件夾、JAR 或 ZIP 文件。(IJavaProject 的子代)IPackageFragment表示工作空間中的一個(gè)部分,對應(yīng)于整個(gè)包或者包的一部分。(IPackageFragmentRoot 的子代)ICompilationUnit表示 Java 源(.java)文件。(IPackageFragment 的子代)IPackageDeclaration表示編譯單元中的軟件包聲明。(ICompilationUnit 的子代)IImportContainer表示編譯單元中的包導(dǎo)入聲明的集合。(ICompilationUnit 的子代

5、)IImportDeclaration表示單個(gè)包導(dǎo)入聲明。(IImportContainer 的子代)IType表示編譯單元內(nèi)的源類型,或者是類文件中的二進(jìn)制類型。IField表示類型中的字段。(IType 的子代)IMethod表示類型中的方法或構(gòu)造函數(shù)。(IType 的子代)IInitializer表示類型中的靜態(tài)或?qū)嵗跏蓟椒?。(IType 的子代)IClassFile表示已編譯(二進(jìn)制)類型。(IPackageFragment 的子代)ITypeParameter 表示類型參數(shù)。(不是任何 Java 元素的子元素,可使用 IType.getTypeParameter(String)

6、或 IMethod.getTypeParameter(String) 獲得)ILocalVariable 表示方法或初始化方法中的局部變量。(不是任何 Java 元素的子元素,可使用 ICodeAssist.codeSelect(int, int) 獲得)所有 Java 元素都支持 IJavaElement 接口。某些元素顯示在“包”視圖中。這些元素實(shí)現(xiàn) IOpenable 接口,原因是必須在打開它們之后才能瀏覽它們。下圖說明這些元素在“包”視圖中是如何表示的。實(shí)現(xiàn) IOpenable 的 Java 元素基本上是根據(jù)在底層資源文件中找到的信息創(chuàng)建的。相同的元素是在資源導(dǎo)航器視圖中按類別表示的。

7、   其他元素對應(yīng)于組成 Java 編譯單元的項(xiàng)。下圖顯示 Java 編譯單元和內(nèi)容大綱窗口(它顯示編譯單元中的源元素)。 因?yàn)檫@些元素可以提供相應(yīng)的源代碼,所以它們實(shí)現(xiàn)了 ISourceReference 接口。(當(dāng)在內(nèi)容大綱窗口中選擇了這些元素時(shí),就會在 Java 編輯器中顯示它們相應(yīng)的源代碼)。Java 元素及其資源許多 Java 元素對應(yīng)于工作空間中的通用資源。當(dāng)您想根據(jù)通用資源來創(chuàng)建 Java 元素時(shí),最好是從類 JavaCore 開始。以下代碼段說明如何從 Java 元素的相應(yīng)資源中獲取 Java 元素。 private void createJavaElementsFr

8、om(IProject myProject, IFolder myFolder, IFile myFile) IJavaProject myJavaProject = JavaCore.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.

9、create(myFolder); / get a .java (compilation unit), .class (class file), or / .jar (package fragment root) IJavaElement myJavaFile = JavaCore.create(myFile); 一旦有了 Java 元素,就可以使用 JDT API 來遍歷和查詢模型。還可以查詢包含在 Java 元素內(nèi)的非 Java 資源。    private void createJavaElementsFrom(IProject myProject, IFolder

10、myFolder, IFile myFile) . / get the non Java resources contained in my project. Object nonJavaChildren = myJavaProject.getNonJavaResources(); . Java 項(xiàng)目當(dāng)根據(jù)簡單項(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_

11、ID)。如果未對項(xiàng)目配置 Java 性質(zhì),則在要求創(chuàng)建項(xiàng)目時(shí),JavaCore 將返回 null。JavaCore 還用來維護(hù) Java 類路徑,包括用于查找源代碼和庫的位置以及用于生成輸出二進(jìn)制(.class)文件的位置。什么是 Java 項(xiàng)目的唯一特征?Java 項(xiàng)目將它們的類路徑記錄在“.classpath”文件中,并將 Java 增量項(xiàng)目構(gòu)建器添加到項(xiàng)目的構(gòu)建規(guī)范中。否則,它們只是常規(guī)項(xiàng)目,并且可以由插件利用其他性質(zhì)(和其他增量構(gòu)建器)來配置。對于那些想要利用除了它們自己的行為之外的 Java 行為來配置項(xiàng)目的插件,它們通常使用 NewJavaProjectWizardPage 來為項(xiàng)

12、目指定除了它們自己的定制性質(zhì)或行為之外的 Java 性質(zhì)。IJavaModel 可以認(rèn)為是工作空間中具有 Java 項(xiàng)目性質(zhì)的所有項(xiàng)目的父代(因此,可以當(dāng)作 IJavaProject)。處理 Java 代碼插件可以使用 JDT API 來創(chuàng)建類或接口、將方法添加到現(xiàn)有類型中或者改變方法的類型。改變 Java 對象最簡單的方法就是使用 Java 元素 API。可以使用更常見的技術(shù)來處理 Java 元素的初始源代碼。使用 Java 元素來修改代碼生成編譯單元 通過程序來生成編譯單元最簡單的方法是使用 IPackageFragment.createCompilationUnit。指定編譯單元的名稱和

13、內(nèi)容。于是在包中創(chuàng)建了編譯單元,并返回新的 ICompilationUnit。通常,可以通過在對應(yīng)包目錄的相應(yīng)文件夾中創(chuàng)建擴(kuò)展名為“.java”的文件資源來按類別創(chuàng)建編譯單元。使用類屬資源 API 對于 Java 工具是一種旁門左道,因此,在通知類屬資源更改偵聽器以及 JDT 偵聽器將 Java 模型更新為新編譯單元之前,Java 模型不會更新。修改編譯單元 大部分對 Java 源代碼的簡單修改可以使用 Java 元素 API 來完成。例如,可以通過編譯單元查詢類型。一旦您具有 IType,就可以使用諸如 createField、createInitializer、createMethod 或

14、 createType 的協(xié)議來將源代碼成員添加至類型。在這些方法中提供了源代碼以及關(guān)于成員的位置的信息。ISourceManipulation 接口定義 Java 元素的常見源代碼處理。這包括用于重命名、移動、復(fù)制或刪除類型的成員的方法。工作副本 可以通過處理編譯單元來修改代碼(于是修改了底層 IFile)或人們可以修改編譯單元的內(nèi)存副本(稱為工作副本)。工作副本是使用 getWorkingCopy 方法從編譯單元中獲取的。(注意,要創(chuàng)建工作副本,編譯單元不需要存在于 Java 模型中。)當(dāng)不再需要這種工作副本時(shí),創(chuàng)建這種工作副本的人員應(yīng)負(fù)責(zé)使用 discardWorkingCopy 方法來

15、廢棄它。工作副本修改內(nèi)存緩沖區(qū)。getWorkingCopy() 方法創(chuàng)建缺省緩沖區(qū),但是客戶機(jī)可以使用 getWorkingCopy(WorkingCopyOwner, IProblemRequestor, IProgressMonitor) 方法提供它們自己的緩沖區(qū)實(shí)現(xiàn)??蛻魴C(jī)可以直接處理此緩沖區(qū)的文本。如果客戶機(jī)直接處理文本,則它們必須經(jīng)常使用 reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor) 方法來使工作副本與緩沖區(qū)同步。最后,可以使用 commitWorkingCopy 方法將工作副本保存至磁盤(用來替換原始的編譯

16、單元)。   例如,下列代碼段使用定制工作副本擁有者在編譯單元上創(chuàng)建工作副本。該代碼段將修改緩沖區(qū)、協(xié)調(diào)更改、將更改落實(shí)到磁盤,最后廢棄工作副本。 / Get original compilation unit ICompilationUnit originalUnit = .; / Get working copy owner WorkingCopyOwner owner = .; / Create working copy ICompilationUnit workingCopy = originalUnit.getWorkingCopy(owner, null, nu

17、ll); / Modify buffer and reconcile IBuffer buffer = (IOpenable)workingCopy).getBuffer(); buffer.append("class X "); workingCopy.reconcile(NO_AST, false, null, null); / Commit changes workingCmitWorkingCopy(false, null); / Destroy working copy workingCopy.discardWorkingCopy();工作副本還可以供若干使用工作

18、副本擁有者的客戶機(jī)共享。稍后可以使用 findWorkingCopy 方法來檢索工作副本。因此,對于原始編譯單元和工作副本擁有者,共享工作副本很重要。下列內(nèi)容說明了客戶機(jī) 1 如何創(chuàng)建共享的工作副本、客戶機(jī) 2 如何檢索此工作副本、客戶機(jī) 1 如何廢棄此工作副本以及嘗試檢索共享的工作副本的客戶機(jī) 2 如何注意到該工作副本不再存在: / Client 1 & 2: Get original compilation unit ICompilationUnit originalUnit = .; / Client 1 & 2: Get working copy owner Worki

19、ngCopyOwner owner = .; / Client 1: Create shared working copy ICompilationUnit workingCopyForClient1 = originalUnit.getWorkingCopy(owner, null, null); / Client 2: Retrieve shared working copy ICompilationUnit workingCopyForClient2 = originalUnit.findWorkingCopy(owner); / This is the same working cop

20、y assert workingCopyForClient1 = workingCopyForClient2; / Client 1: Discard shared working copy workingCopyForClient1.discardWorkingCopy(); / Client 2: Attempt to retrieve shared working copy and find out it's null workingCopyForClient2 = originalUnit.findWorkingCopy(owner); assert workingCopyFo

21、rClient2 = null;使用 DOM/AST API 來修改代碼有三種方法來創(chuàng)建 CompilationUnit。第一種方法是使用 ASTParser。第二種方法是使用 ICompilationUnit#reconcile(.)。第三種方法是從頭開始對 AST(抽象語法樹)使用工廠方法。 從現(xiàn)有的源代碼創(chuàng)建 AST必須使用 ASTParser.newParser(int) 來創(chuàng)建 ASTParser 的實(shí)例。將使用下列其中一個(gè)方法將源代碼提供給 ASTParser: · setSource(char):從源代碼創(chuàng)建 AST · setSource(IClassFil

22、e):從類文件創(chuàng)建 AST · setSource(ICompilationUnit):從編譯單元創(chuàng)建 AST 然后通過調(diào)用 createAST(IProgressMonitor) 來創(chuàng)建 AST。結(jié)果是每個(gè)節(jié)點(diǎn)都有一個(gè)具有正確源位置的 AST。在使用 setResolveBindings(boolean) 創(chuàng)建樹之前,必須請求綁定的解決方案。解決綁定是一個(gè)成本很高的操作,僅當(dāng)需要時(shí)才執(zhí)行。一旦修改了樹,就會丟失所有位置和綁定。 通過協(xié)調(diào)工作副本來創(chuàng)建 AST 如果工作副本不一致(已修改),則可以通過調(diào)用方法 reconcile(int, boolean, org.eclipse.j

23、dt.core.WorkingCopyOwner, org.eclipse.core.runtime.IProgressMonitor) 來創(chuàng)建 AST。要請求 AST 創(chuàng)建,使用 AST.JLS2 作為第一個(gè)參數(shù)來調(diào)用 reconcile(.) 方法。僅當(dāng)問題請求程序是活動或者當(dāng)強(qiáng)制執(zhí)行問題檢測時(shí),才會計(jì)算其綁定。解決綁定是一個(gè)成本很高的操作,僅當(dāng)需要時(shí)才執(zhí)行。一旦修改了樹,就會丟失所有位置和綁定。 從頭開始 可以通過對 AST 使用工廠方法來從頭創(chuàng)建 CompilationUnit。這些方法名以 new. 開頭。以下是創(chuàng)建 HelloWorld 類的一個(gè)示例。第一個(gè)代碼段是生成的輸出: p

24、ackage example; import java.util.*; public class HelloWorld public static void main(String args) System.out.println("Hello" + " world");下列代碼段是生成輸出的相應(yīng)代碼。 AST ast = new AST();CompilationUnit unit = ast.newCompilationUnit();PackageDeclaration packageDeclaration = ast.newPackageDecla

25、ration();packageDeclaration.setName(ast.newSimpleName("example");unit.setPackage(packageDeclaration);ImportDeclaration importDeclaration = ast.newImportDeclaration();QualifiedName name =ast.newQualifiedName(ast.newSimpleName("java"),ast.newSimpleName("util");importDecla

26、ration.setName(name);importDeclaration.setOnDemand(true);unit.imports().add(importDeclaration);TypeDeclaration type = ast.newTypeDeclaration();type.setInterface(false);type.setModifiers(Modifier.PUBLIC);type.setName(ast.newSimpleName("HelloWorld");MethodDeclaration methodDeclaration = ast.

27、newMethodDeclaration();methodDeclaration.setConstructor(false);methodDeclaration.setModifiers(Modifier.PUBLIC | Modifier.STATIC);methodDeclaration.setName(ast.newSimpleName("main");methodDeclaration.setReturnType(ast.newPrimitiveType(PrimitiveType.VOID);SingleVariableDeclaration variableDe

28、claration = ast.newSingleVariableDeclaration();variableDeclaration.setModifiers(Modifier.NONE);variableDeclaration.setType(ast.newArrayType(ast.newSimpleType(ast.newSimpleName("String");variableDeclaration.setName(ast.newSimpleName("args");methodDeclaration.parameters().add(varia

29、bleDeclaration);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);methodInvocation.setName(ast.n

30、ewSimpleName("println");InfixExpression infixExpression = ast.newInfixExpression();infixExpression.setOperator(InfixExpression.Operator.PLUS);StringLiteral literal = ast.newStringLiteral();literal.setLiteralValue("Hello");infixExpression.setLeftOperand(literal);literal = ast.newS

31、tringLiteral();literal.setLiteralValue(" world");infixExpression.setRightOperand(literal);methodInvocation.arguments().add(infixExpression);ExpressionStatement expressionStatement = ast.newExpressionStatement(methodInvocation);block.statements().add(expressionStatement);methodDeclaration.s

32、etBody(block);type.bodyDeclarations().add(methodDeclaration);unit.types().add(type);檢索額外的位置DOM/AST 節(jié)點(diǎn)只包含一對位置(起始位置和節(jié)點(diǎn)的長度)。這并不總是夠用。要檢索中間位置,應(yīng)使用 IScanner API。例如,我們具有想要對其了解 instanceof 運(yùn)算符的位置的 InstanceofExpression??梢跃帉懸韵路椒▉韺?shí)現(xiàn)此目的: private int getOperatorPosition(Expression expression, char source) if (expr

33、ession instanceof InstanceofExpression) 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(

34、) != ITerminalSymbols.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 接口中定義的。迭代和檢

35、索正確的標(biāo)記是非常簡單的。如果想要在 SuperMethodInvocation 中查找 super 關(guān)鍵字的位置,則還建議您使用掃描程序。 源代碼修改某些源代碼修改不是通過 Java 元素 API 來提供的。編輯源代碼(例如,更改現(xiàn)有元素的源代碼)的較常見方法是使用編譯單元的初始源代碼和 DOM/AST 的重寫 API 來完成的。要執(zhí)行 DOM/AST 重寫,存在兩組 API:描述性重寫和修改重寫。 描述性 API 不修改 AST,而是使用 ASTRewrite API 來生成修改描述。AST 重寫程序收集對節(jié)點(diǎn)修改的描述并將這些描述轉(zhuǎn)換為可以適用于初始源代碼的文本編輯。 / creatio

36、n of a Document ICompilationUnit 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); Compilation

37、Unit astRoot = (CompilationUnit) 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"

38、;); rewrite.replace(oldName, newName, null); / 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.getBuffe

39、r().setContents(newSource);修改 API 允許直接修改 AST: · 請求記錄修改(CompilationUnit.recordModifications())。 · 對 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.getBuf

40、fer().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) parser.createAST(null); / start record of the modifications astRoot.recordMo

41、difications(); / modify the AST TypeDeclaration typeDeclaration = (TypeDeclaration)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

42、().getOptions(true); / computation of the new source code edits.apply(document); String newSource = document.get(); / update of the compilation unit cu.getBuffer().setContents(newSource);對 Java 元素的更改作出響應(yīng)如果事后插件需要知道對 Java 元素所作的更改,則可以向 JavaCore 注冊 Java IElementChangedListener。 JavaCore.addElementChange

43、dListener(new MyJavaElementChangeReporter();還可以更具體,并使用 addElementChangedListener(IElementChangedListener, int) 來指定您感興趣的事件的類型。例如,如果您只想在協(xié)調(diào)操作期間偵聽事件: JavaCore.addElementChangedListener(new MyJavaElementChangeReporter(), ElementChangedEvent.POST_RECONCILE);JavaCore 支持二種類型的事件: · POST_CHANGE:在相應(yīng)的 POST

44、_CHANGE 資源更改通知期間,將通知此事件類型的偵聽器。 · POST_RECONCILE:在結(jié)束對工作副本的協(xié)調(diào)操作時(shí),將通知此事件類型的偵聽器(請參閱 ICompilationUnit.reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor))。 Java 元素更改偵聽器在概念上類似于資源更改偵聽器(在跟蹤資源更改中進(jìn)行了描述)。下列代碼段實(shí)現(xiàn) Java 元素更改指示器,它將元素變化打印到系統(tǒng)控制臺中。public class MyJavaElementChangeReporter implements IElem

45、entChangedListener public void elementChanged(ElementChangedEvent event) IJavaElementDelta delta= event.getDelta(); if (delta != null) System.out.println("delta received: "); System.out.print(delta); IJavaElementDelta 包括已更改的元素和描述所發(fā)生的更改類型的標(biāo)志。在大多數(shù)時(shí)候,delta 樹的根位于“Java 模型”級別。然后,客戶機(jī)必須使用 getAffec

46、tedChildren 來瀏覽此 delta 以了解已經(jīng)更改了哪些項(xiàng)目。以下示例方法遍歷 delta,并打印已添加、已除去和已更改的元素: void traverseAndPrint(IJavaElementDelta delta) switch (delta.getKind() case IJavaElementDelta.ADDED: System.out.println(delta.getElement() + " was added"); break; case IJavaElementDelta.REMOVED: System.out.println(delta.

47、getElement() + " was removed"); break; case IJavaElementDelta.CHANGED: System.out.println(delta.getElement() + " was changed"); if (delta.getFlags() & IJavaElementDelta.F_CHILDREN) != 0) System.out.println("The change was in its children"); if (delta.getFlags() &

48、; IJavaElementDelta.F_CONTENT) != 0) System.out.println("The change was in its content"); /* Others flags can also be checked */ break; IJavaElementDelta children = delta.getAffectedChildren(); for (int i = 0; i < children.length; i+) traverseAndPrint(childreni); 有多種操作可以觸發(fā) Java 元素更改通知。以

49、下是一些示例: · 創(chuàng)建資源,例如 IPackageFragment.createCompilationUnit(delta 指示編譯單元的添加) · 修改資源,例如 ICompilationUnit.createType(delta 指示編譯單元已更改,并且已添加類型來作為此編譯單元的子代) · 修改項(xiàng)目的類路徑,例如 IJavaProject.setRawClasspath(delta 指示包段根目錄已添加至類路徑、已從類路徑中除去或在類路徑上已重新排序) · 修改類路徑變量值,例如 JavaCore.setClasspathVariable(del

50、ta 還指示包段根目錄已經(jīng)受到影響) · 更改 .jar 文件的源代碼連接,例如 IPackageFragmentRoot.attachSource(delta 指示源已拆離,然后連接) · 使工作副本與它的緩沖區(qū)協(xié)調(diào),例如 IWorkingCopy.reconcile · 修改以“.java”結(jié)尾并且在項(xiàng)目的類路徑上的 IFile,例如,使用 IFile.setContents(delta 指示編譯單元已更改,但是未提供更詳細(xì)的信息,原因是這不是通過“Java 模型”操作來完成的) 與 IResourceDelta 相似,可以使用 IWorkspaceRunna

51、ble 來對 Java 元素 delta 進(jìn)行批處理。立即就會合并和報(bào)告在 IWorkspaceRunnable 中運(yùn)行的若干“Java 模型”操作產(chǎn)生的 delta。   JavaCore 提供了 run 方法來對 Java 元素更改進(jìn)行批處理。例如,以下代碼段將觸發(fā)兩個(gè) Java 元素更改事件: / Get package IPackageFragment pkg = .; / Create 2 compilation units ICompilationUnit unitA = pkg.createCompilationUnit("A.java",

52、 "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 v

53、oid 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)

54、建路徑本節(jié)描述如何設(shè)置 Java 構(gòu)建路徑。構(gòu)建路徑是用于構(gòu)建 Java 項(xiàng)目(IJavaProject)的類路徑。類路徑只是一組用于描述可用類型的類路徑條目(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)一步包含一組包段。此處對構(gòu)建路徑的討論不涉及 Java 運(yùn)行時(shí)路徑,Java 運(yùn)行時(shí)路徑可以獨(dú)立于構(gòu)建路徑進(jìn)行定義。(有關(guān)運(yùn)行時(shí)類

55、路徑的討論,請參閱運(yùn)行 Java 代碼。)更改構(gòu)建路徑可以通過對相應(yīng)項(xiàng)目的 Java 元素使用 setRawClasspath 來使用程序更改項(xiàng)目的構(gòu)建路徑。以下代碼設(shè)置項(xiàng)目資源的類路徑: IProject project = . / get some project resourceIJavaProject javaProject = JavaCore.create(project);IClasspathEntry newClasspath = .;javaProject.setRawClasspath(newClasspath, someProgressMonitor);(注意:術(shù)語“原始”類路徑用來強(qiáng)調(diào)尚未解析任何用來描述條目位置的變量的事實(shí)。)Java 構(gòu)建路徑保存在項(xiàng)目的文件結(jié)構(gòu)中的名為“.classpath”的文件中。此文件可用來提供一種方法來通過某些源代碼資源庫與其他項(xiàng)目共享 Java 構(gòu)建路徑設(shè)置。需要特別指出的是,由于可能會毀壞此文件,所以不應(yīng)該手工編輯它。 類路徑條

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論