当前位置: 首页 > 知识库问答 >
问题:

Eclipse Scout的JavaParser和SymbolSolver

钱俊楚
2023-03-14

我想分析我已经开始使用JavaParser和它的SymbolResolver的类之间的依赖关系。但是当从Eclipse Scout解析示例项目上的几个方法引用时,它总是失败。Scout使用它自己的BEAN管理器,它在jvm启动时将java类加载到列表中,这使得在运行时加载和卸载类更加灵活。但是Eclipse IDE能够以某种方式解析依赖关系。这是我用于解析Eclipse Scout项目的工作示例:

    private static String getFullyQualifiedName(MethodCallExpr exp) {
        String result = "";
        try {
            result = exp.getName() + " --> " + exp.resolve().getQualifiedSignature();
        } catch (RuntimeException e) {
            result = "!unable to resolve! " + exp.getName();
        }
        return result;
    }

    private static void runAnalysis(String sourceFolder) {
        final ProjectRoot projectRoot = new SymbolSolverCollectionStrategy().collect(new File(sourceFolder).toPath());
        projectRoot.getSourceRoots().forEach(sourceRoot -> sourceRoot.tryToParseParallelized()
            .forEach(parsedSource -> parsedSource.getResult().get().findAll(MethodCallExpr.class)
                .forEach(exp -> System.out.println(parsedSource.getResult().get().getPackageDeclaration().get().getNameAsString()
                    + "." + parsedSource.getResult().get().getStorage().get().getFileName()
                    + " (" + exp.getBegin().get().line + ") "
                    + getFullyQualifiedName(exp)))));
    }

我将所有maven依赖项JAR添加到源根文件夹以及所有源代码中,我只使用了Scout提供的一个简单的helloworld示例。在我看来,它工作的原因和时间与无法解析MethodCallEx的时间似乎很随机。Java Symbol Solver甚至能够解析某些BEAN。get()依赖项,这很好。

成功的输出如下所示:

scout.ui.html.UiServletFilter.java (66) destroy --> org.eclipse.scout.rt.server.commons.authentication.DevelopmentAccessController.destroy()

和这样一个失败的输出:

scout.server.helloworld.HelloWorldService.java (15) !unable to resolve! getUserId

但是Eclipse IDE能够解析所有类和方法调用。

共有1个答案

寇和璧
2023-03-14

您的分析是在运行时还是在基于源代码的 IDE 中进行的?前者是关于侦察兵运行时和Bean管理器的问题,当BEAN被调用时使用,后者是关于侦察SDK的问题,你可以在这里下载:用于侦察兵开发人员的Eclipse IDE。

我假设您想分析源代码。当您下载上面提到的Eclipse包时,您将得到带有EclipseScout附加插件的EclipseIDE。这些插件使用Eclipse平台提供的工具来分析Scout类。因此,我建议您查看Eclipse Scout SDK源代码,并使用相同的工具进行分析。确保选择与Scout项目版本匹配的发布分支。

 类似资料:
  • 我已经阅读了JavaParser手册,并开始构建自己的示例。我想要实现的是阅读Java代码并在其上插入新的代码行。具体来说,我想在每个和语句之前初始化一个计数器,并在语句体内部对计数器进行递增。我这样做的目的是为一组指定的运行运行运行新代码,并观察每个分支执行了多少次。我使用JavaParser来解析和添加代码,因为我想自动生成和运行所有东西。 例如,我们有以下简单的代码: 在解析之后,我想有如下

  • 我需要对java解析器生成的AST执行一些操作。我的问题是我想检查一个类初始化周期问题是否存在。 一个例子是, 类的初始化顺序可能会有所不同,导致mark1. x和mark2. p的不同值的计算。我试图使用javaparser生成的AST实现它,但没有得到可行的解决方案。

  • 我正在使用JavaParser并关注它的Wiki。问题是,即使我更改了方法的名称并向其添加了一个参数,文件也不会更新。换句话说,更改不会被保存。当我更改后的,它会打印出更改,但这些更改根本不会影响源文件。 有类似于编译单元的东西吗。update()还是我遗漏了什么? 我在维基上使用的例子是: 编辑:以下是解决方案;在下面的行中添加; 在下面的行中更改为使用特殊字符(例如“ş,ö,ü…”) 到

  • 是否可以获取不带注释的方法语句列表,我使用了,这是输出 我只想声明结果是这样的

  • 我能够使用以下代码获得类级变量的声明。但我只需要变量名。这是以下代码的输出-[私有布尔标志=true;]

  • 这是A.java 我想得到Newa. java 我想使用javaparser添加一个变量。