2016-12-16 12 views
0

私はeclipse-jdt-astを使ってオーバーライドメソッドバインディングを取得しようとしています。 eclipseを使用しているときと同じように、Ctrlキーを押しながらメソッドをクリックすると、メソッドの実装にジャンプできます。jdt.astを使用して多型を解決する方法

これは、Javaの動的bingingだが、次は適切に機能しますが:

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; 
} 

} 

uはここで読むことができると思いますそれは、少し長いけど簡単です。個人的には、
findDeclaringNodeメソッドがそれを行う可能性があります。しかし、バインディングを渡すとnullを返します。だからあなたはどんなアイデアを持っていますか? ありがとうたくさん

答えて

1

与えられたスーパーメソッドのすべての実装を探しているとき、ASTはそのバインディングでさえ、subからsuperへの参照しか持ちませんが、逆の方向ではないのでほとんど役に立ちません。

反対方向に検索すると、SearchEngineが使用されます。 JavaElementImplementationHyperlinkを見るとline 218(現在のHEAD現在)

スーパーメソッドを表すIMethodをまず見つけなければなりません。最後にengine.search(..)を呼び出す前にSearchRequestorIJavaSearchScope、およびSearchPatternを準備します。検索結果はArrayList<IJavaElement> linksに集められます。

のEclipseの良い伝統はプラグイン開発「猿は猿が何を参照してください」であるので、私は、このコードを見ては、あなたの追求を始めることを願っています:)

+0

あなたの答えを感謝し、私は理解してい今すぐコード! – CXWorks

+0

ああ、もう1つの質問、どうやってそれを見つけましたか?私は検索しようとしましたが、あまりにも多くのコードがあります – CXWorks

+0

正直言って、私はすでにあなたがASTだけでなく検索エンジンを必要としていると感じていました。そのような一般的な直感を得るには、JDTに関するチュートリアルの1つ、たとえばhttp://www.eclipsecon.org/2012/sites/eclipsecon.org.2012/files/How%20Toを参照することをお勧めします%20Train%20the%20JDT%20Dragon%20combined.pdfもう一つの選択肢は、デバッガを使って実際にツールを見ていることです。 –

関連する問題