2016-12-16 22 views
0

我正在通過eclipse-jdt-ast獲取覆蓋方法綁定。 就像我們在使用eclipse時一樣,按下Ctrl並單擊該方法,我們可以跳轉到方法實現。如何使用jdt.ast解決多態性問題

雖然它是一個Java的動態暴食,但以下效果很好:

public class Father{ 
public void test(){} 
} 

和兒子:

public class Son extends Father{ 
@Override 
public void test(){} 

    public static void main (String[] arg){ 
    Father f=new Son(); 
    f.test(); 
    } 
} 

當我們點擊主測試中,我們可以正確地跳到兒子。 java 我想知道如何去做。我試圖查看源代碼,但沒有找到位置,因爲代碼太多。

而且我現在的代碼是:

public class Main { 
static String filep="example/Son.java"; 
static String[] src={"example/"}; 
static String[] classfile={"example/"}; 

public static void main(String[] args) throws IOException,Exception{ 

    ASTParser parser = ASTParser.newParser(AST.JLS8); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setSource(Files.toString(new File(filep), Charsets.UTF_8).toCharArray()); 
    // only setEnvironment can we get bindings from char[] 
    parser.setEnvironment(classfile, src, null, true); 
    parser.setUnitName(filep); 
    parser.setResolveBindings(true); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null); 
    if (compilationUnit.getAST().hasResolvedBindings()) { 
     System.out.println("Binding activated."); 
    } 
    else { 
     System.out.println("Binding is not activated."); 
    } 
    ASTNode node=compilationUnit.findDeclaringNode("f"); 
    compilationUnit.accept(new Myvisitor(compilationUnit)); 
} 
} 

而我的客人是:

public class Myvisitor extends ASTVisitor { 
int i=0; 
CompilationUnit compilationUnit; 
Myvisitor(CompilationUnit compilationUnit){ 
    this.compilationUnit=compilationUnit; 
} 


@Override 
public boolean visit(MethodInvocation node) { 
    i++; 
    System.out.println(i); 
    IMethodBinding binding=node.resolveMethodBinding(); 

    ASTNode astNode=compilationUnit.findDeclaringNode(binding); 
    System.out.println(astNode); 
    return true; 
} 

} 

這是一個有點長,但簡單的,希望你能讀到這裏。就我個人而言,我猜想012De1,但是,當我通過綁定時它返回null。那麼你有什麼想法嗎? 非常感謝

回答

1

在尋找給定超級方法的所有實現時,AST沒有什麼幫助,因爲即使使用它的綁定,它也只有從sub到super的引用,但不是相反的方向。

在相反方向搜索使用SearchEngine。如果你看JavaElementImplementationHyperlink相關的代碼部分可以找到line 218(截至目前頭)

您將不得不首先找到代表超級方法的IMethod。然後在最後調用engine.search(..)之前準備SearchRequestorIJavaSearchScopeSearchPattern。搜索結果收集在ArrayList<IJavaElement> links

的Eclipse的優良傳統插件開發是「猴子看,猴子做」,所以我希望在看這個代碼將讓你開始你的追求:)

+0

感謝您的回答,我的理解現在的代碼! – CXWorks

+0

哦,還有一個問題,你是怎麼找到它的?我試圖搜索,但代碼太多 – CXWorks

+0

說實話,我已經有一種感覺,你需要搜索引擎,而不僅僅是AST :)。爲了獲得這種普遍的直覺,通過JDT上的其中一個教程可能會有所幫助,例如http://www.eclipsecon.org/2012/sites/eclipsecon.org.2012/files/How%20To %20Train%20the%20JDT%20Dragon%20combined.pdf另一個選項是使用調試器來觀察工具。 –