Eclipse JDT ASTParser - MethodVisitor 问题

2024-07-03

我正在编写一些代码来解析java源代码。我正在尝试 Eclipse JDT AST 解析器。我的代码如下。 (解析代码)。我正在针对我用 Java 编写的 Mailer 应用程序测试解析器(第二个代码片段)。我的解析器正在访问除generateEmail() 和debug() 方法之外的所有方法。我查遍了所有地方,但我无法理解为什么会发生这种情况。谁能告诉我我做错了什么?是内存问题吗?我没有收到任何 OutOfMemoryException

我想使用 MethodVisitor 方法访问特定方法,以访问特定方法中的语句和变量。

我的解析代码

public class RuleEngine {

public static void parse(String file) {
    File java = new File(file);
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    String code = readFile(java);
    parser.setSource(code.toCharArray());
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    final CompilationUnit cu = (CompilationUnit) parser.createAST(null);


    cu.accept(new ASTVisitor() {

        public boolean visit(ImportDeclaration id) {
            Name imp = id.getName();
            debug("import", id.getName().getFullyQualifiedName());
            return false;
        }

        public boolean visit(VariableDeclarationFragment node) {
            SimpleName name = node.getName();
            debug("var.declaration", (name.getFullyQualifiedName() + ":" + cu.getLineNumber(name.getStartPosition())));
            return false; // do not continue 
        }

        public boolean visit(MethodDeclaration method) {
            debug("method", method.getName().getFullyQualifiedName());
            debug("method.return", method.getReturnType2().toString());
            List<SingleVariableDeclaration> params = method.parameters();

            for(SingleVariableDeclaration param: params) {
                debug("param", param.getName().getFullyQualifiedName());
            }

            Block methodBlock = method.getBody();
            String myblock = methodBlock.toString();
            methodVisitor(myblock);
            return false;
        }


    });

}

public static void methodVisitor(String content) {
    debug("entering met visitor", "1");
    ASTParser metparse = ASTParser.newParser(AST.JLS3);
    metparse.setSource(content.toCharArray());
    metparse.setKind(ASTParser.K_STATEMENTS);
    Block block = (Block) metparse.createAST(null);

    block.accept(new ASTVisitor() {
        public boolean visit(VariableDeclarationFragment var) {
            debug("met.var", var.getName().getFullyQualifiedName());
            return false;
        }

        public boolean visit(SimpleName node) {
            debug("SimpleName node", node.getFullyQualifiedName());
            return false;
        }
        public boolean visit(IfStatement myif) {
            debug("if.statement", myif.toString());
            return false;
        }

    });
}

public static void debug(String ref, String message) {
    System.out.println(ref +": " + message);
}

public static void main(String[]args) {
    parse("MailerDaemon.java");
}

这是我的 MailerDaemon 代码

public boolean isBccMode() {
    return bccMode;
}

public void setBccMode(boolean bccMode) {
    this.bccMode = bccMode;
}

public void setServerPort(String serverPortAddr) {
    String[] elems = serverPortAddr.split("\\:");
    this.setServerAddr(elems[0]);
    this.setSmtpPort(elems[1]);
}

public String getServerAddr() {
    int i = 0;
    return serverAddr;
}
public void setServerAddr(String serverAddr) {
    this.serverAddr = serverAddr;
}
public boolean isSslOn() {
    return isSslOn;
}
public void setSslOn(boolean isSslOn) {
    this.isSslOn = isSslOn;
}
public String getSmtpPort() {
    return smtpPort;
}
public void setSmtpPort(String smtpPort) {
    this.smtpPort = smtpPort;
}
public String getFromEmail() {
    return fromEmail;
}
public void setFromEmail(String fromEmail) {
    this.fromEmail = fromEmail;
}
public String getToEmails() {
    return toEmails;
}
public void setToEmails(String toEmails) {
    this.toEmails = toEmails;
}
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public String getSubject() {
    return subject;
}
public void setSubject(String subject) {
    this.subject = subject;
}
public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}
public String getCcList() {
    return ccList;
}
public void setCcList(String ccList) {
    this.ccList = ccList;
}
public String getBccList() {
    return bccList;
}
public void setBccList(String bccList) {
    this.bccList = bccList;
}



public String getFile() {
    return file;
}
public void setFile(String file) {
    debug("filename: " + file);
    this.file = file;
}
public void generateEmail() {
    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", this.getSmtpPort());
    if(isSslOn()) {
        props.put("mail.smtp.socketFactory.port", this.getSmtpPort());
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    }
    props.put("mail.smtp.host", getServerAddr());

    Session session = Session.getDefaultInstance(props, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(getUsername(), getPassword());
        }
    });


    Message msg = new MimeMessage(session);
    try {
        msg.setFrom(new InternetAddress(this.getFromEmail()));
        if (getToEmails() != null) {
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(getToEmails()));
        } else if (isBccMode()) {
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(getFromEmail()));
        }

        //msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(getCcList()));
        msg.setSubject(getSubject());
        //msg.setText(getMessage());
        MimeBodyPart messagePart = new MimeBodyPart();
        messagePart.setText(getMessage());

        /*
        MimeBodyPart attachments = new MimeBodyPart();
        FileDataSource fd = new FileDataSource(getFile());
        attachments.setDataHandler(new DataHandler(fd));
        attachments.setFileName(fd.getName());
        */

        Multipart mp = new MimeMultipart();
        mp.addBodyPart(messagePart);
        //mp.addBodyPart(attachments);

        msg.setContent(mp);
        Transport.send(msg);
        debug("Done. Closing Session...");

    } catch (AddressException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static void debug(String message) {
    System.out.println("[DEBUG]: " + message);
}

我发现您的解析代码没有明显的问题。我希望它在尝试解析时在某个地方失败generateEmail()方法。由于解析器遵循顺序方法,debug()方法也没有被解析。尝试将语句括在public boolean visit(MethodDeclaration method)在可能带有 Throwable 子句的 try-catch 块中。

另请检查您的readFile()方法。读取文件时最常见的一个问题是缺少向每一行添加新行字符。不附加新行会导致代码构造错误,尤其是当代码中有注释时。您可以检查compilationUnit.getProblems()检查任何此类问题的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse JDT ASTParser - MethodVisitor 问题 的相关文章

  • Java Appengine APPSTATS 导致 java 内存不足错误

    我的 java appengine 应用程序中有几个 servlet 它们在内存中进行排序 并需要几秒钟的时间才能完成 这些完全没有错误 但是 我最近为 appengine 启用了 appstats 并开始收到以下错误 java lang
  • 使用 Java 打开 Arduino 上的 LED

    我安装了 Java 串行 RXTX 库并正确设置了 Arduino 我什至已经启动并运行了示例代码 但我似乎无法理解如何访问不同的 Arduino 引脚以打开 LED 等 如何使用 OutputStream 或任何其他方式访问引脚 我是否需
  • 杰克逊没有认识到存在的领域

    这是我的 JSON totalSize 46 done true records Name Wamu I Start Date c 2016 09 26T16 56 10 000 0000 Status c Completed Type c
  • 如何使用ast.NodeVisitor的简单示例?

    有谁有一个使用 ast NodeVisitor 来遍历 Python 2 6 中的抽象语法树的简单示例吗 我不清楚访问和 generic visit 之间的区别 而且我找不到任何使用谷歌代码搜索或普通谷歌的示例 ast visit 当然 除
  • 如何安装Slick2d?

    您好 我正在尝试使用 LWJGL 库和 Slick2D 游戏库创建一个游戏 但是当我尝试运行它时出现错误 这是我的代码 package test import org newdawn slick AppGameContainer impor
  • Spring-security - AccessDecisionVoter-impl 不会被调用

    我正在尝试创建自定义 AccessDecisionVoter 并在调用它时将其停止在调试中 我在每个方法中都设置了断点 但没有任何反应 spring security xml
  • Java 8 模块与 OSGi 有何不同?

    Java 8 和 Jigsaw 项目为 SDK 带来了模块系统 我认为这是一件好事 因为它是软件包的一部分 内置 OSGi 还提供了一个模块系统 但需要一个容器 但除此之外 它们之间的主要区别是什么 如果我使用 OSGi 我是否能够使用标准
  • 使用文件服务 URL 从 blobstore 删除文件

    在我的应用程序 GAE 上的 GWT 中 我们将存储在 blobstore 上的服务 URL 存储在数据库中 当用户选择这些文件之一并单击 删除 时 我们需要从 blobstore 中删除该文件 这是我们的代码 但它根本没有删除文件 pub
  • 如何在 ADF Oracle 11gR1 中的对话框窗口中的弹出窗口中刷新表

    我正在研究显示一个带有搜索表的弹出窗口的要求 当用户单击弹出窗口中的搜索按钮 提供输入文本框 时 需要使用新的数据集刷新搜索表 我创建了一个populateSearchTable 通过填充数组中的值来生成表的方法deviceListArra
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • JOGL/OpenGL VBO - 如何渲染顶点?

    3我有以下SceneRenderer类 实现GLEventListener 我想我了解创建缓冲区 存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程 请参阅 init 方法 我奋斗的地方是展示 方法 我几乎尝试了在互联网上找到的所有内容
  • Spring Actuator 可以与非 Web Spring Boot 应用程序一起使用吗?

    我有一个 Spring Boot 应用程序 它侦听来自 IBM MQ 输入队列的消息 对消息进行一些处理 然后将消息放入输出队列 像这样的应用程序可以利用Spring执行器来监视应用程序 例如心跳检查 吗 从执行器文档来看 它似乎只能与 S
  • “?” 是什么意思?在Java中是什么意思? [复制]

    这个问题在这里已经有答案了 我不知道问号是什么 在java中代表 我正在做一个小程序 一个Nim游戏 正在寻找一本书寻求帮助 并看到这样的说法 int pinsToTake min gt 2 2 1 看不懂 什么会 代表 它可能与 if 语
  • Jenkins 中的算法协商失败 SSH

    我正在尝试从 Jenkins ssh 到本地服务器 但抛出以下错误 SSH Exception Algorithm negotiation fail com jcraft jsch JSchException Algorithm negot
  • CLASSPATH 中存在未使用的 JAR 文件的影响

    我在这里阅读了很多有关可用工具的问答unusedJAR 例如 loosejar http code google com p loosejar 类路径助手 http classpathhelper sourceforge net 我的问题是
  • 使用 Apache CXF 2.4 JAX-RS 和 Spring Security 3.2 获取用户名

    我在 JAX RS 资源中获取用户名SecurityContextHolder这有效 Path myresource public class MyResoure Get public String getUserName return S
  • 如何限制匿名子类的创建(Java)

    抱歉 我之前没有正确表述这个问题 我尝试实现工厂模式 一个更好的例子 它是一个带有 create 函数的抽象类 Human 根据创建时传递的参数 它决定是返回其子类 Man 的实例还是返回 Woman 子类的实例 因此 您可以使用以下命令调
  • 避免 xjc 生成的代码出现编译器警告

    我的根本问题是如何从 未经检查的泛型类型 Eclipse 编译器警告中受益 但问题视图中没有这些警告列表 这些警告被 xjc 从 xsd 文件生成的 java 类的噪声污染 通过 maven jaxb2 插入 我读过其他地方 我可以忽略每个
  • 为什么 List.contains() 在 Collections Java 中将 Object 作为参数 [重复]

    这个问题在这里已经有答案了 The java util List contains Object o 方法需要Object作为参数并在内部使用Object equals Object o 如上所述here http docs oracle
  • MySQL 连接器错误“服务器时区值中欧时间”[重复]

    这个问题在这里已经有答案了 我的问题 MySQL 连接器 服务器时区值中欧时间 无法识别或代表多个时区 该项目 小型网络项目 JavaEE Tomcat 8 5 MySQL Maven 我的尝试 Maven gt 将 MySQL 连接器从

随机推荐

  • 在 Perl 中进行单元测试期间提示用户

    我正在编写一个模块 该模块具有需要运行某个外部服务器程序的单元测试 如果是 则需要知道主机名和端口 我想在运行测试套件时提示输入此信息 并在用户拒绝提供时跳过这些测试 处理这个问题的最佳方法是什么 Thanks 您在寻找吗ExtUtils
  • 在 Perl 中进行单元测试期间提示用户

    我正在编写一个模块 该模块具有需要运行某个外部服务器程序的单元测试 如果是 则需要知道主机名和端口 我想在运行测试套件时提示输入此信息 并在用户拒绝提供时跳过这些测试 处理这个问题的最佳方法是什么 Thanks 您在寻找吗ExtUtils
  • 使用包含函数名称的字符串调用函数

    我有一个类定义为 class modify field public std string modify std string str return str 有什么方法可以将此函数名称存储在主函数的字符串中 然后调用它 我尝试过这个 但它不
  • 使用包含函数名称的字符串调用函数

    我有一个类定义为 class modify field public std string modify std string str return str 有什么方法可以将此函数名称存储在主函数的字符串中 然后调用它 我尝试过这个 但它不
  • 查找由不规则数据点定义的体积 - python

    我试图使用 python 找到给定一组数据点 x y z 的体积 这些数据点是从实验中收集的样本 因此绘制的表面可能非常不规则 我已经弄清楚了如何创建 3D 绘图 但没有弄清楚如何使用 python 计算体积 X Y np meshgrid
  • 查找由不规则数据点定义的体积 - python

    我试图使用 python 找到给定一组数据点 x y z 的体积 这些数据点是从实验中收集的样本 因此绘制的表面可能非常不规则 我已经弄清楚了如何创建 3D 绘图 但没有弄清楚如何使用 python 计算体积 X Y np meshgrid
  • 并行运行 Promise 时,Promise.all(...).spread 不是一个函数

    我尝试与sequ elize 并行运行2 个promise 然后在 ejs 模板中渲染结果 但我收到此错误 Promise all spread is not a function 这是我的代码 var environment hash r
  • 并行运行 Promise 时,Promise.all(...).spread 不是一个函数

    我尝试与sequ elize 并行运行2 个promise 然后在 ejs 模板中渲染结果 但我收到此错误 Promise all spread is not a function 这是我的代码 var environment hash r
  • Webdeploy 发布配置文件密码保存

    我将发布配置文件以及所有登录信息保存到 xml 中 但是当我将此 XML 导入到另一台计算机并尝试发布时 它会说我的密码不正确 如何才能将密码正确保存到发布配置文件中并与其他计算机兼容 我的猜测是 该程序故意使用当前 PC 的 盐 来混淆密
  • Webdeploy 发布配置文件密码保存

    我将发布配置文件以及所有登录信息保存到 xml 中 但是当我将此 XML 导入到另一台计算机并尝试发布时 它会说我的密码不正确 如何才能将密码正确保存到发布配置文件中并与其他计算机兼容 我的猜测是 该程序故意使用当前 PC 的 盐 来混淆密
  • 如何解决“不是有效的 XPath 表达式”错误

    在Java上的selenium中 我尝试找到一个元素并在网页上选择它 但它不断收到错误 The string id app article div 2 section div 1 div 5 div section 2 div 2 div
  • 如何解决“不是有效的 XPath 表达式”错误

    在Java上的selenium中 我尝试找到一个元素并在网页上选择它 但它不断收到错误 The string id app article div 2 section div 1 div 5 div section 2 div 2 div
  • 如何从 Swift textView 获取文本?

    我正在尝试学习 Swift 在 Java 我的 母语 语言 中 如果我有一个 JTextFielda我想获取它的内容 我只需调用 JTextField textField new JTextField String output textF
  • 如何从 Swift textView 获取文本?

    我正在尝试学习 Swift 在 Java 我的 母语 语言 中 如果我有一个 JTextFielda我想获取它的内容 我只需调用 JTextField textField new JTextField String output textF
  • Laravel:期待响应 250,但收到“”和消息“”

    我继续从 Laravel 收到此错误 但一切看起来都是正确的 Expecting response 250 but got with message 根据我的研究 通过 Sendgrid 或任何提供商 发送电子邮件并且接收服务器以空白代码响
  • Laravel:期待响应 250,但收到“”和消息“”

    我继续从 Laravel 收到此错误 但一切看起来都是正确的 Expecting response 250 but got with message 根据我的研究 通过 Sendgrid 或任何提供商 发送电子邮件并且接收服务器以空白代码响
  • Google Sheets 脚本函数 UrlFetchApp.fetch 不是从 .onEdit(e) 运行,而是从编辑器运行

    我创建了一个谷歌表格 其中包含沙滩排球杯的大量信息 我想在该表格中选中复选框时调用我创建的 API function onEdit e const ui SpreadsheetApp getUi const spreadsheets Spr
  • Google Sheets 脚本函数 UrlFetchApp.fetch 不是从 .onEdit(e) 运行,而是从编辑器运行

    我创建了一个谷歌表格 其中包含沙滩排球杯的大量信息 我想在该表格中选中复选框时调用我创建的 API function onEdit e const ui SpreadsheetApp getUi const spreadsheets Spr
  • Eclipse JDT ASTParser - MethodVisitor 问题

    我正在编写一些代码来解析java源代码 我正在尝试 Eclipse JDT AST 解析器 我的代码如下 解析代码 我正在针对我用 Java 编写的 Mailer 应用程序测试解析器 第二个代码片段 我的解析器正在访问除generateEm
  • Eclipse JDT ASTParser - MethodVisitor 问题

    我正在编写一些代码来解析java源代码 我正在尝试 Eclipse JDT AST 解析器 我的代码如下 解析代码 我正在针对我用 Java 编写的 Mailer 应用程序测试解析器 第二个代码片段 我的解析器正在访问除generateEm