javaparser UnsolvedSymbolException—在被解析的类上使用的类使用另一个未解析的类
我不确定我是否在标题中很好地描述了这个问题,但以下是背景: 我想解析一个java源代码,比如TestClassOne.java TestClassOne使用另一个声明为实例变量的类“TestClass2”。现在,TestClass2将一个类TestClass3声明为实例变量 现在,当我的目标类TestClassOne通过TestClass2获取TestClass3的引用时,问题就出现了,因此方法test()如下: 这是一个例外:javaparser UnsolvedSymbolException—在被解析的类上使用的类使用另一个未解析的类,java,javaparser,Java,Javaparser,我不确定我是否在标题中很好地描述了这个问题,但以下是背景: 我想解析一个java源代码,比如TestClassOne.java TestClassOne使用另一个声明为实例变量的类“TestClass2”。现在,TestClass2将一个类TestClass3声明为实例变量 现在,当我的目标类TestClassOne通过TestClass2获取TestClass3的引用时,问题就出现了,因此方法test()如下: 这是一个例外: Exception in thread "main" Unsolv
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();
}
}
测试类别二:
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")));
如何正确地做到这一点
谢谢和问候 这是JavaSymbolSolver的管理员。定义
JavaParserTypeSolver
实例时,应指向源目录的根,因为JavaSymbolSolver将查找从源目录根计算路径的类,并考虑包。例如,如果指定JavaSymbolSolver(新文件(“/src/foo”)
,然后查找类a.b.C.java
,它将检查名为/src/foo/a/b/C.java
的文件是否存在。您不指定包目录。如果指定JavaSymbolSolver(新文件(“/src/foo/a/b”)
,它将查找不存在的文件src/foo/a/b/a/b/C.java
这有帮助吗?对于较新的版本,例如
3.16.3
,这仍然是实际的吗?我想你可以提供一个项目根路径,这个工具可以自己找出源目录。。。
combinedTypeSolver.add(
new JavaParserTypeSolver(new File("..src/javaparser_pkg3")));