当前位置: 首页 > 面试题库 >

如何在Eclipse之外的项目中使用Java Eclipse抽象语法树?(即不是eclipse插件)

方茂
2023-03-14
问题内容

如何在Eclipse之外的项目中使用Java Eclipse抽象语法树?(即不是eclipse插件)

我看到的所有Eclipse AST示例都是针对eclipse插件的。有没有一种方法(即示例)将月食AST用于非月食项目。


问题答案:

给定一个Java 1.5文件,以下是我用来执行此操作的代码。我对此很陌生,今天花了很多时间浏览并尝试使下面的代码正常工作。

public void processJavaFile(File file) {
    String source = FileUtils.readFileToString(file);
    Document document = new Document(source);
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(document.get().toCharArray());
    CompilationUnit unit = (CompilationUnit)parser.createAST(null);
    unit.recordModifications();

    // to get the imports from the file
    List<ImportDeclaration> imports = unit.imports();
    for (ImportDeclaration i : imports) {
        System.out.println(i.getName().getFullyQualifiedName());
    }

    // to create a new import
    AST ast = unit.getAST();
    ImportDeclaration id = ast.newImportDeclaration();
    String classToImport = "path.to.some.class";
    id.setName(ast.newName(classToImport.split("\\.")));
    unit.imports().add(id); // add import declaration at end

    // to save the changed file
    TextEdit edits = unit.rewrite(document, null);
    edits.apply(document);
    FileUtils.writeStringToFile(file, document.get());

    // to iterate through methods
    List<AbstractTypeDeclaration> types = unit.types();
    for (AbstractTypeDeclaration type : types) {
        if (type.getNodeType() == ASTNode.TYPE_DECLARATION) {
            // Class def found
            List<BodyDeclaration> bodies = type.bodyDeclarations();
            for (BodyDeclaration body : bodies) {
                if (body.getNodeType() == ASTNode.METHOD_DECLARATION) {
                    MethodDeclaration method = (MethodDeclaration)body;
                    System.out.println("name: " + method.getName().getFullyQualifiedName());
                }
            }
        }
    }
}

这需要以下库:

commons-io-1.4.jar
org.eclipse.jdt.core_xxxx.jar
org.eclipse.core.resources_xxxx.jar
org.eclipse.core.jobs_xxxx.jar
org.eclipse.core.runtime_xxxx.jar
org.eclipse.core.contenttype_xxxx.jar
org.eclipse.equinox.common_xxxx.jar
org.eclipse.equinox.preferences_xxxx.jar
org.eclipse.osgi_xxxx.jar
org.eclipse.text_xxxx.jar


 类似资料:
  • 我在使用Maven和'Eclipse Kepler Javaee'。我在'maven-compiler-plugin'中有这样的内容:

  • 我想在一个Swing应用程序中使用一些JavaFX组件(特别是JFXPanel的HTML5呈现支持)。我的应用程序目前是在Eclipse4.3(Kepler)中设置的,我的机器上安装了最新的Java7 JDK。 这篇来自Oracle的教程建议您只需引用一个JavaFX类,它就可以在Swing应用程序中工作。所以我输入,但是Eclipse不能将其识别为有效的Java类。它确实可以识别其他Java7类

  • 问题内容: 我想用Xtend语言编写Java类(仅仅是因为它的简洁性),然后将其编译回Java类,以便在Java项目中使用。就像咖啡脚本。我怎样才能做到这一点? 我尝试像创建新类一样创建Xtend文件,但是出现此错误: 在类路径上找不到必需的库包。 这将禁用智能感知(自动补全)。另外,即使我确实可以正常工作,如何将其编译为Java类? 问题答案: 尝试过同样的事情之后,我可以确认启用Xtend N

  • 问题内容: 我正在将Maven与“ Eclipse Kepler JavaEE”结合使用。我在’maven-compiler-plugin’中有这样的内容: 每次我更改“ pom.xml”中的内容时,eclipse都会强制我执行“ Maven->更新项目”,然后将项目设置更改为使用JRE而不是JDK,并且某些maven构建停止工作。 我发现解决此问题的唯一方法是设置如何设置eclipse / m2

  • 问题内容: 我有一个Java项目,我想开发它而不替换源代码。我想将代码链接到我的工作空间而不进行物理替换吗? 问题答案: 从中选择您要引用的 右键单击并转到(或按Ctrl-Enter)。 在中,您可以添加当前打开的另一个项目。 如果您要覆盖某个类,则可以在当前项目中对其进行复制,然后将其移至中的类路径中。

  • 我可以将EclipseJava开发工具作为独立进程执行吗?我需要使用另一个程序的Eclipse JDT获取Java程序的AST结构,为此,我需要在后台将eclipse插件作为独立进程执行。 这可能吗?如果可能,怎么能做到呢?