2017-05-08 20 views
1

タイトルによく記述されていますが、ここに背景がありますかわかりません: javaソースコードを解析したい、TestClassOne.javaと言ってください。javaparser UnsolvedSymbolException - 解析中のクラスで使用されているクラスで、未解決の別のクラスが使用されています

TestClassOneは、インスタンス変数として宣言された別のクラス "TestClassTwo"を使用します。さて、TestClassTwoは、インスタンス変数として宣言されたクラスTestClassThreeを持っています。

TestClassTwo経由TestClassThreeの参照を取得したときに、私のターゲットクラス-TestClassOne、だから今、問題は、このようにメソッドのテスト(、発生する)以下:

public class TestClassOne {  
     private TestClassTwo testTwo = new TestClassTwo(); 

    public void test() { 
     TestClassThree three = testTwo.getTestThree(); 
    } 
    } 

これは例外である:

Exception in thread "main" UnsolvedSymbolException{context='unknown', name='TestClassThree', typeSolver=null} 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(JavaParserFacade.java:418) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(JavaParserFacade.java:395) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsageVariableType(JavaParserFacade.java:387) 
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:302) 
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:34) 
    at com.github.javaparser.ast.expr.VariableDeclarationExpr.accept(VariableDeclarationExpr.java:104) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:371) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:263) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:257) 

import com.github.javaparser.JavaParser; 
import com.github.javaparser.ParseException; 
import com.github.javaparser.ast.CompilationUnit; 
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; 
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; 
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; 
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; 
public class TestParser { 

    public static void main(String[] args) throws FileNotFoundException, ParseException { 

     TypeCalculatorVisitor visitor = new TypeCalculatorVisitor(); 

     CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); 
     combinedTypeSolver.add(new ReflectionTypeSolver()); 

     combinedTypeSolver 
     .add(new JavaParserTypeSolver(new File("..src/javaparser"))); 

     combinedTypeSolver.add(
     new JavaParserTypeSolver(new File("..src/javaparser_pkg2"))); 

     combinedTypeSolver.add(
     new JavaParserTypeSolver(new File("..src/javaparser_pkg3")));  

     CompilationUnit agendaCu = JavaParser.parse(new FileInputStream(
       new File("..src/javaparser/TestClassOne.java"))); 

     agendaCu.accept(visitor, JavaParserFacade.get(combinedTypeSolver)); 

     System.out.println(visitor.getParseResult()); 
    } 

} 

TestClassOne:

はここに私のコードです

import javaparser_pkg2.TestClassTwo; 
import javaparser_pkg3.TestClassThree; 

public class TestClassOne { 
    private TestClassTwo testTwo = new TestClassTwo(); 

    public void test() { 
     TestClassThree three = testTwo.getTestThree(); 
    } 
} 

TestClassTwo:

import javaparser_pkg3.TestClassThree; 

public class TestClassTwo { 
    private int age; 
    private String status; 

    private TestClassThree testThree = new TestClassThree(); 

    public TestClassThree getTestThree() { 
     return testThree; 
    } 
    public void setTestThree(TestClassThree testThree) { 
     this.testThree = testThree; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 
    public String getStatus() { 
     return status; 
    } 
    public void setStatus(String status) { 
     this.status = status; 
    } 

} 

TestClassThree:

package javaparser_pkg3; 

public class TestClassThree { 
    private String name; 
    private int ID; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getID() { 
     return ID; 
    } 
    public void setID(int iD) { 
     ID = iD; 
    } 

} 

私はcombinedTypeResolverとしてTestClassThreeのディレクトリを追加した(上記参照)が、まだ動作しません:

combinedTypeSolver.add(
      new JavaParserTypeSolver(new File("..src/javaparser_pkg3"))); 

これはどのように適切に行われるべきですか?

ありがとうございます。

答えて

1

ここにJavaSymbolSolverのmantainerがあります。 JavaParserTypeSolverインスタンスを定義するときは、JavaSymbolSolverはパッケージを考慮してソースディレクトリのルートからパスを計算するクラスを探すため、ソースディレクトリのルートを指す必要があります。たとえば、JavaSymbolSolver(new File("/src/foo"))と指定してからa.b.C.javaを検索すると、/src/foo/a/b/C.javaという名前のファイルが存在するかどうかが確認されます。 packagesディレクトリは指定しないでください。 JavaSymbolSolver(new File("/src/foo/a/b"))と指定すると、存在しないファイルsrc/foo/a/b/a/b/C.javaが検索されます。

役立ちますか?

関連する問題