如何解决如何使用 Eclipse JDT 核心 AST 解析器中的类型绑定获取类型的内部名称?
我设法使用 eclipse jdt core ast 解析器解析了一段代码并解析了类型绑定,但我无法获取类型的内部名称,即采用以下格式:
java/util/Map$Entry
使用 getBinaryName(),它给出了非常接近的结果:
java.util.Map$Entry
我可以很好地用斜线替换点,但具有讽刺意味的是,实现却恰恰相反。它当然会做它应该做的事情,因为它是 JSR 中定义的二进制名称,这不是我需要的,但是以另一种方式再次替换对我来说会很奇怪。
来自 org.eclipse.jdt.core.dom.TypeBinding.getBinaryName() :
char[] dotSeparated = CharOperation.replaceOncopy(constantPoolName,'/','.');
return new String(dotSeparated);
在我正在解析的示例代码下方(此代码除了被解析器使用外没有其他用途):
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
// This code has no other purpose than being consumed by a parser
public class ParseMe {
public static Map<String,Object> map = new HashMap<>();
static {
for (Entry<String,Object> entry : map.entrySet()) {
System.out.println(entry);
}
}
}
这里是解析器主类:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Hashtable;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.compilationunit;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jface.text.Document;
public class TestJDT {
public static void main(String[] args) throws IOException {
String javaSourceFilePath = args[0];
Document doc = new Document(new String(Files.readAllBytes(Paths.get(javaSourceFilePath))));
ASTParser parser = ASTParser.newParser(AST.JLS_Latest);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(doc.get().tochararray());
parser.setBindingsRecovery(true);
parser.setResolveBindings(true);
parser.setStatementsRecovery(true);
parser.setEnvironment(null,null,true);
Hashtable<String,String> options = JavaCore.getoptions();
options.put(JavaCore.COMPILER_COMPLIANCE,JavaCore.VERSION_1_8);
options.put(JavaCore.COMPILER_SOURCE,JavaCore.VERSION_1_8);
options.put(JavaCore.CORE_ENCODING,"UTF-8");
parser.setCompilerOptions(options);
parser.setUnitName(new File(args[0]).getName());
compilationunit cu = (compilationunit) parser.createAST(null);
cu.accept(new ASTVisitor() {
@Override
public boolean visit(SingleVariableDeclaration node) {
ITypeBinding typeBinding = node.resolveBinding().getType();
System.out.println(typeBinding.getBinaryName());
return super.visit(node);
}
});
}
}
以及 gradle 依赖项:
compile 'org.eclipse.jdt:org.eclipse.jdt.core:3.25.0'
所以问题是:eclipse jdt 核心是否有一个 API 方法可以给我类型的内部名称?用斜线代替点是一个有效的选项吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。