微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Eclipse JDT 核心 AST 解析器中的类型绑定获取类型的内部名称?

如何解决如何使用 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 举报,一经查实,本站将立刻删除。