问题如下;

Java代码中的方法是:

Rule foo()

{

return sequence(foo(), x());

}

这将引发解析循环,当然应该避免;但是,这是合法的:

Rule foo()

{

return sequence(x(), foo());

}

现在,代码中的其他地方我可以访问RuleMethod,这是一个扩展MethodNode的类,因此我可以访问以下信息:

> ruleMethod.name:foo; (在MethodNode中定义)

> ruleMethod.desc :()Lorg / parboiled / Rule; (在MethodNode中定义)

> ruleMethod.ownerClass:com.github.fge.grappa.experiments.SelfReferringRule.MyParser(在RuleMethod中定义)

上面第一个代码提取的字节码如下:

Method 'foo':

0 L0

1 ALOAD 0

2 ALOAD 0

3 INVOKEVIRTUAL com/github/fge/grappa/experiments/SelfReferringRule$MyParser.foo ()Lorg/parboiled/Rule;

4 ALOAD 0

5 INVOKEVIRTUAL com/github/fge/grappa/experiments/SelfReferringRule$MyParser.x ()Lorg/parboiled/Rule;

6 ICONST_0

7 ANEWARRAY java/lang/Object

8 INVOKEVIRTUAL com/github/fge/grappa/experiments/SelfReferringRule$MyParser.sequence (Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Lorg/parboiled/Rule;

9 ARETURN

10 L1

这意味着我可以获得的每一个信息都能够发现,至少在上面的字节码中,foo()是sequence()调用的第一个参数,因为构造函数接受三个参数并且有三个元素在堆栈上.

但当然我不能在运行时“眼睛检查”.因此我需要一种方法来做到这一点……

看起来我需要的是一个MethodVisitor和一些visitInsn(),然后看看有什么参数并正确检测……

但我没有任何想法从哪里开始;在网上搜索似乎只是举例说明如何修改字节码,而不是检测这种情况:/

我从哪里开始?

asm 5 java,java – 使用ASM(5.x)在字节代码中检测运行时的递归方法调用:howto?相关推荐

  1. java 捕获运行时异常_java-如何通过ASM在字节码中捕获运行时异常

    我试图通过异常捕获运行时异常.我能够捕获通常的方法退出事件. 但是,控件永远不会到达opcode == Opcodes.ATHROW. 我认为在调用事件时做错了事. 这是我的示例代码: public ...

  2. java 内存情况_Java代码中获取运行时内存情况

    在此之前,还是先看下JVM内存结构和JVM参数调优,网上太多不说也罢. 另外提醒的是方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系. public class Test { p ...

  3. java slf4j日志级别_java - 在slf4j中设置运行时消息的日志级别 - 堆栈内存溢出

    ===============>>#1 票数:41 已采纳 使用slf4j无法做到这slf4j . 我想,缺少这个功能的原因是,几乎不可能为slf4j构建一个Level类型,它可以有效地映 ...

  4. java 运行时异常 处理_如何在Java中处理运行时异常?

    运行时异常是Java编程语言所有异常的父类,这些异常在发生时会崩溃或崩溃,可能会破坏程序或应用程序.与不被视为运行时异常的异常不同,永远不会检查运行时异常. "运行时异常"通常显示 ...

  5. java 不要使用魔法值_可别在代码中写那么多魔法值了,脑壳疼!

    1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(string value) { if ("0".equals(value)) { //t ...

  6. JAVA异常处理、自定义异常、throws关键字与throw关键字、运行时异常

    异常捕捉, try-catch语句. package YH;public class Thundering {public static void main(String[] args) {try { ...

  7. Java初学者作业——实现控制台的猜数字游戏。游戏运行时产生一个1~100之间的随机数字

    返回本章节 返回作业目录 需求说明: (1)实现控制台的猜数字游戏.游戏运行时产生一个1-100之间的随机数字 (2)要求用户从控制台输入数字,若输入的数字比随机数小,则输出"太小了,再大一 ...

  8. java 不变式_solr - Solr错误:在请求处理程序中使用不变式时,QueryComponent.mergeIds(QueryComponent.java:940) - 堆栈内存溢出...

    我需要一个仅在集合中返回特定字段集的搜索请求处理程序,但是出于安全原因,没有人可以更改要显示的字段. (有些索引敏感字段我不希望任何人访问它) 我试图在请求处理程序中使用不变式 ,并在那里定义字段列表 ...

  9. java readline最后一行_java – 如何在reader.readLine()中检测第一行和最后一行?

    酷问题我打了一圈,这是一个 SSCCE,只是copy'n'paste'n'run它. package com.stackoverflow.q2292917; import java.io.Buffer ...

最新文章

  1. Qt OpenCV Win10环境配置
  2. Android开源项目源码下载(不断更新中)
  3. NLP/CV模型跨界,视觉Transformer赶超CNN?
  4. git 远程仓库版本的回退以及git reset 几种常用方式记录
  5. ARM WFI和WFE指令
  6. Struts2-EL表达式为什么能获取值栈数据
  7. TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!...
  8. 一个关于人工智能实现的讨论
  9. dj鲜生-22-模板抽离-列表页详情页模板的抽离-base_detail_list
  10. Windows Home Server 常见问题
  11. eclipse svn设置忽略文件
  12. spring 包的依赖问题
  13. 【HP-MC/SG】HP-MC/SG添加LV测试
  14. windows无法连接到user profile service服务。此问题阻止标准用户登录系统
  15. 这些专业是考研大户!
  16. element中表格展开行的默认展开和收起
  17. 酷炫一款动态背景(HTML +js canvas)
  18. 双官能交联剂点击试剂DBCO-PEG4-DBCO
  19. Code bloat has become astronomical
  20. IRIS Docker的安装

热门文章

  1. art-template用户注册方法
  2. C#中使用NPIO实现导入导出Excel简单操作
  3. oracle sql loop merge,Oracle之存储过程和MERGE INTO语句
  4. excel删除行 uipath_学会这8个Excel神技巧,轻松告别零基础!
  5. 关于eclipse的一些简单配置
  6. linux 动态库构造函数,Linux共享库全局构造函数的相互依赖性
  7. mysql 两字段相乘_sql统计2列相乘和语句.doc
  8. 钉钉电脑版如何申请调休 钉钉电脑版申请调休方法
  9. Win7系统设置ip地址的方法
  10. @Aspect中@Pointcut 12种用法