首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习Java,为什么trees.getElement(treepath)返回null?

学习Java,为什么trees.getElement(treepath)返回null?
EN

Stack Overflow用户
提问于 2014-06-01 01:55:27
回答 1查看 692关注 0票数 0

我试图用解析一个java文件。

文件很差。经过几个小时的挖掘,我仍然无法让Trees#getElement为我工作。这是我的密码:

代码语言:javascript
复制
import com.sun.source.tree.*;
import com.sun.source.util.*;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.IOException;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class CodeAnalyzerTreeVisitor extends TreePathScanner<Object, Trees> {
    @Override
    public Object visitClass(ClassTree classTree, Trees trees) {
        System.out.println("className " + classTree.getSimpleName());
        //prints name of class
        TreePath path = getCurrentPath();

        printLocationAndSource(trees, path, classTree);
        //prints the original source code

while (path != null) { System.out.println("treepath"); System.out.println(trees.getElement(path)); path = path.getParentPath(); } //it prints several nulls here //why?

代码语言:javascript
复制
        return super.visitClass(classTree, trees);
    }

    public static void printLocationAndSource(Trees trees,
                                              TreePath path, Tree tree) {
        SourcePositions sourcePosition = trees.getSourcePositions();

        long startPosition = sourcePosition.
                getStartPosition(path.getCompilationUnit(), tree);
        long endPosition = sourcePosition.
                getEndPosition(path.getCompilationUnit(), tree);

        JavaFileObject file = path.getCompilationUnit().getSourceFile();
        CharBuffer sourceContent = null;
        try {
            sourceContent = CharBuffer.wrap(file.getCharContent(true).toString().toCharArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        CharBuffer relatedSource = null;
        if (sourceContent != null) {
            relatedSource = sourceContent.subSequence((int) startPosition, (int) endPosition);
        }

        System.out.println("start: " + startPosition + " end: " + endPosition);
//        System.out.println("source: "+relatedSource);
        System.out.println();
    }
}

public class JavaParser {
    private static final JavaCompiler javac
            = ToolProvider.getSystemJavaCompiler();
    private static final String filePath = "/home/pinyin/Source/hadoop-common/hadoop-yarn-project/hadoop-ya" +
            "rn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/ya" +
            "rn/server/resourcemanager/ResourceManager.java";

    public static void main(String[] args) throws IOException {
        StandardJavaFileManager jfm = javac.getStandardFileManager(null, null, null);
        Iterable<? extends javax.tools.JavaFileObject> javaFileObjects = jfm.getJavaFileObjects(filePath);
        String[] sourcePathParam = {
                "-sourcepath",
                "/home/pinyin/Source/hadoop-common/hadoop-yarn-project/hadoop-yarn/" +
                        "hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/"
        };
        List<String> params = new ArrayList<String>();
        params.addAll(Arrays.asList(sourcePathParam));

        JavacTask task = (JavacTask) javac.getTask(null, jfm, null, params, null, javaFileObjects);

        Iterable<? extends CompilationUnitTree> asts = task.parse();
        Trees trees = Trees.instance(task);

        for (CompilationUnitTree ast : asts) {
            new CodeAnalyzerTreeVisitor().scan(ast, trees);
        }
    }
}

添加有关params-sourcepath的行是因为我认为编译器试图在错误的位置找到源文件。他们没有工作。

我仍在试图了解Trees、javac和相关的JSR是如何协同工作的,是否有适合初学者的推荐文档?谢谢你的帮助。

编辑:,我试图分析的java文件是:https://github.com/apache/hadoop-common/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ResourceManager.java

该文件可以在其maven项目中编译而没有错误,但在我的情况下,它的依赖项不会传递给javac。我不确定这是不是问题所在。

trees.getElement在上面代码的中间部分返回null,而其他部分似乎运行良好。

EN

回答 1

Stack Overflow用户

发布于 2014-06-01 08:34:08

根据this answer,在编译完成之前,Element的信息似乎是不可用的。

所以打电话给task.analyze()解决了我的问题。尽管javac正在抱怨缺少依赖关系。

如果我错了,请纠正我,谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23976103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档