2017-05-08 5 views
1

제목에 문제를 잘 설명했지만 배경은 다음과 같습니다. Java 소스 코드를 구문 분석하고 싶습니다. , TestClassOne.java라고 말하십시오.javaparser UnsolvedSymbolException - 구문 분석중인 클래스에서 사용되는 클래스가 해결되지 않은 다른 클래스를 사용합니다.

TestClassOne은 인스턴스 변수로 선언 된 다른 클래스 "TestClassTwo"를 사용합니다. 이제 TestClassTwo에는 인스턴스 변수로 선언 된 TestClassThree 클래스가 있습니다.

은 그래서 지금, 문제는 내 목표 클래스 TestClassOne는 아래 TestClassTwo를 통해 TestClassThree의 참조, 따라서 방법 테스트() 얻을 때 발생 :

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) 
:

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

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

이를 예외입니다

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 : 나는 아직도 combinedTypeResolver (위 참조) 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; 
    } 

} 

이 작동하지 않습니다

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 파일을 찾습니다.

도움이 되셨습니까?

관련 문제