2

我不确定我是否在标题中很好地描述了这个问题,但这里是背景:我想解析一个 java 源代码,比如 TestClassOne.java。

TestClassOne 使用另一个声明为实例变量的类“TestClassTwo”。现在,TestClassTwo 有一个类 TestClassThree 声明为实例变量。

所以现在,当我的目标类TestClassOne通过TestClassTwo获取TestClassThree的引用时,问题就出现了,因此下面的方法test():

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

}

测试类一:

import javaparser_pkg2.TestClassTwo;
import javaparser_pkg3.TestClassThree;

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

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

测试类二:

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

}

测试类三:

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

}

我已将 TestClassThree 的目录添加为 combinedTypeResolver (见上文),但仍然无法正常工作:

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

这应该如何正确完成?

谢谢并恭祝安康!

4

1 回答 1

6

这里是 JavaSymbolSolver 的维护者。当您定义您的JavaParserTypeSolver实例时,您应该指向源目录的根目录,因为 JavaSymbolSolver 将查找计算从源目录根目录考虑包的路径的类。例如,如果您指定JavaSymbolSolver(new File("/src/foo"))然后查找类a.b.C.java,它将检查名为的文件是否/src/foo/a/b/C.java存在。您不指定包目录。如果您指定JavaSymbolSolver(new File("/src/foo/a/b"))它将查找src/foo/a/b/a/b/C.java不存在的文件。

它有帮助吗?

于 2017-05-09T18:11:59.960 回答